使用比较器按索引对 List<String[]> 进行排序
Sort a List<String[]> by indices using Comparator
我有一个 CSV 文件,我需要按两列对内容进行排序。第一列是日期,第四列是文本。我需要按第一列和第四列排序的文件。
我正在尝试这样:
//i read file and iterate in lines
PriorityQueue<String[]> linesOrdenered = new PriorityQueue<>(new LineComparator());
while ((line = br.readLine()) != null) {
String[] row = line.split(CVS_SPLIT_BY);
if ((!isHeader) && row[0].equals("Route Date")) {
header = line;
isHeader = true;
continue;
}
linesOrdenered.add(row);
}
public class LineComparator implements Comparator<String[]> {
//string[3] == key
@Override
public int compare(String[] strings, String[] t1) {
int keyComparator = 0;
try {
Date dataOne = format.parse(strings[0]);
Date dataTwo = format.parse(t1[0]);
keyComparator = dataOne.compareTo(dataTwo);
} catch (ParseException e) {
LOGGER.error("Error on parse Data [{}]", e.getMessage());
}
if (keyComparator == 0) {
keyComparator = strings[3].compareTo(t1[3]);
}
return keyComparator;
}
}
结果是一个只排序日期的 PriorityQueue。
CSV 文件的示例内容:
12/01/2018,6:30,C-993BNT,A1001
12/03/2018,6:30,C-993BNT,A1001
12/04/2018,6:30,C-993BNT,A1001
12/05/2018,6:30,C-993BNT,A1001
12/01/2018,6:30,C-555BQJ,A1003
12/03/2018,6:30,C-555BQJ,A1003
12/04/2018,6:30,C-555BQJ,A1003
12/05/2018,6:30,C-555BQJ,A1003
12/06/2018,6:30,C-555BQJ,A1003
12/07/2018,6:30,C-555BQJ,A1003
您的输入文件和 "format" 对我们不可用,但我有根据的猜测是使用格式解析时所有日期都不同(至少在比较它们的范围内 return 0).
继续 Roy Shahaf 的想法,假设:
private static DateFormat format = new SimpleDateFormat("MM/dd/yyyy");
我得到:
12/01/2018,6:30,C-993BNT,A1001
12/01/2018,6:30,C-555BQJ,A1003
12/03/2018,6:30,C-993BNT,A1001
12/03/2018,6:30,C-555BQJ,A1003
12/04/2018,6:30,C-993BNT,A1001
12/04/2018,6:30,C-555BQJ,A1003
12/05/2018,6:30,C-993BNT,A1001
12/05/2018,6:30,C-555BQJ,A1003
12/06/2018,6:30,C-555BQJ,A1003
12/07/2018,6:30,C-555BQJ,A1003
我觉得很合适。见 https://jdoodle.com/a/QXP
我有一个 CSV 文件,我需要按两列对内容进行排序。第一列是日期,第四列是文本。我需要按第一列和第四列排序的文件。 我正在尝试这样:
//i read file and iterate in lines
PriorityQueue<String[]> linesOrdenered = new PriorityQueue<>(new LineComparator());
while ((line = br.readLine()) != null) {
String[] row = line.split(CVS_SPLIT_BY);
if ((!isHeader) && row[0].equals("Route Date")) {
header = line;
isHeader = true;
continue;
}
linesOrdenered.add(row);
}
public class LineComparator implements Comparator<String[]> {
//string[3] == key
@Override
public int compare(String[] strings, String[] t1) {
int keyComparator = 0;
try {
Date dataOne = format.parse(strings[0]);
Date dataTwo = format.parse(t1[0]);
keyComparator = dataOne.compareTo(dataTwo);
} catch (ParseException e) {
LOGGER.error("Error on parse Data [{}]", e.getMessage());
}
if (keyComparator == 0) {
keyComparator = strings[3].compareTo(t1[3]);
}
return keyComparator;
}
}
结果是一个只排序日期的 PriorityQueue。 CSV 文件的示例内容:
12/01/2018,6:30,C-993BNT,A1001
12/03/2018,6:30,C-993BNT,A1001
12/04/2018,6:30,C-993BNT,A1001
12/05/2018,6:30,C-993BNT,A1001
12/01/2018,6:30,C-555BQJ,A1003
12/03/2018,6:30,C-555BQJ,A1003
12/04/2018,6:30,C-555BQJ,A1003
12/05/2018,6:30,C-555BQJ,A1003
12/06/2018,6:30,C-555BQJ,A1003
12/07/2018,6:30,C-555BQJ,A1003
您的输入文件和 "format" 对我们不可用,但我有根据的猜测是使用格式解析时所有日期都不同(至少在比较它们的范围内 return 0).
继续 Roy Shahaf 的想法,假设:
private static DateFormat format = new SimpleDateFormat("MM/dd/yyyy");
我得到:
12/01/2018,6:30,C-993BNT,A1001
12/01/2018,6:30,C-555BQJ,A1003
12/03/2018,6:30,C-993BNT,A1001
12/03/2018,6:30,C-555BQJ,A1003
12/04/2018,6:30,C-993BNT,A1001
12/04/2018,6:30,C-555BQJ,A1003
12/05/2018,6:30,C-993BNT,A1001
12/05/2018,6:30,C-555BQJ,A1003
12/06/2018,6:30,C-555BQJ,A1003
12/07/2018,6:30,C-555BQJ,A1003
我觉得很合适。见 https://jdoodle.com/a/QXP