我想用Java读取CSV文件并使用特定列对其进行排序。我的CSV文件如下所示:
ABC,DEF,11,GHI....
JKL,MNO,10,PQR....
STU,VWX,12,XYZ....
考虑到我想使用第三列对其进行排序,我的输出应该如下所示:
JKL,MNO,10,PQR....
ABC,DEF,11,GHI....
STU,VWX,12,XYZ....
在对用于保存CSV数据的数据结构进行一些研究之后,这里的人建议使用带有整数和列表的地图数据结构作为键和值对in this question:
Map<Integer, List<String>>
where the value, List<String> = {[ABC,DEF,11,GHI....], [JKL,MNO,10,PQR....],[STU,VWX,12,XYZ....]...}
And the key will be an auto-incremented integer starting from 0.
那么有人可以建议一种方法来使用Java中“List”中的元素对此Map进行排序吗?此外,如果您认为这种数据结构选择不好,请随时建议更简单的数据结构。
谢谢。
答案 0 :(得分:4)
在Java 8中,你可以做到
SortedMap<Integer, List<String>> collect = Files.lines(Paths.get(filename))
.collect(Collectors.groupingBy(
l -> Integer.valueOf(l.split(",", 4)[2]),
TreeMap::new, Collectors.toList()));
注意:比较数字是字符串是一个坏主意,"100" < "2"
可能不是你所期望的。
我会使用排序的多地图。如果你没有方便,你就可以做到这一点。
SortedMap<Integer, List<String>> linesByKey = new TreeMap<>();
public void addLine(String line) {
Integer key = Integer.valueOf(line.split(",", 4));
List<String> lines = linesByKey.get(key);
if (lines == null)
linesByKey.put(key, lines = new ArrayList<>());
lines.add(line);
}
这将生成一系列行,按照具有重复数字的行具有保留顺序的数字排序。例如如果所有行都有相同的数字,则顺序不变。
答案 1 :(得分:2)
我会使用ArrayList
ArrayList
的{{1}}:
String
每个条目都是一行,这是一个字符串列表。 您可以通过以下方式初始化列表:
ArrayList<ArrayList<String>>
获取第n行:
List<ArrayList<String>> csvLines = new ArrayList<ArrayList<String>>();
要对您编写自定义比较器进行排序。在该比较器的构造函数中,您可以传递用于排序的字段位置。
然后,compare方法获取存储位置的String值,并根据位置将其转换为基本ava类型。例如,你知道在csv的第2位有一个Integer,然后将String转换为int。这对于相应的排序是必要的。您还可以将Class的ArrayList传递给构造函数,以便它知道哪个字段是什么类型
然后使用List<String> line = csvLines.get(n);
或String.compareTo()
,具体取决于列位置等。
编辑工作代码示例:
Integer.compare()
答案 2 :(得分:0)
您还可以使用列表列表:
List<List<String>> Llp = new ArrayList<List<String>>();
然后你需要调用扩展自定义比较器的sort,它比较列表中的第三项:
Collections.sort(Llp, new Comparator<LinkedList<String>>() {
@Override
public int compare(LinkedList<String> o1, LinkedList<String> o2) {
try {
return o1.get(2).compareTo(o2.get(2));
} catch (IndexOutOfBoundsException e) {
return 0;
}
}
答案 3 :(得分:0)
在下面的代码中,我根据第二列对CSV文件进行了排序。
public static void main(String[] args) throws IOException {
String csvFile = "file_1.csv";
String line = "";
String cvsSplitBy = ",";
List<List<String>> llp = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
while ((line = br.readLine()) != null) {
llp.add(Arrays.asList(line.split(cvsSplitBy)));
}
llp.sort(new Comparator<List<String>>() {
@Override
public int compare(List<String> o1, List<String> o2) {
return o1.get(1).compareTo(o2.get(1));
}
});
System.out.println(llp);
} catch (IOException e) {
e.printStackTrace();
}
}