我正在从csv文件中读取学生数据,并尝试通过使用marks列以降序对数据进行排序,并尝试获取前n位和后n位学生记录。我面临的问题是如何按特定列对完整的csv文件进行排序以及在何处存储排序后的数据以及如何检索前n个学生记录。
我尝试使用以下代码对标记列进行排序。通过使用该字段,我可以对该列进行排序,但无法获取剩余的字段,例如名称,编号和电话号码。
String splitBy = ",";
String line = "";
ArrayList<String> marks = new ArrayList<>();
BufferedReader br = new BufferedReader(new FileReader("Student_Records.csv"));
while((line = br.readLine()) != null) {
String[] b = line.split(splitBy);
//System.out.println(b[5]+" && "+b[6]);
marks.add(b[7]);
}
List<Integer> newList = marks.stream()
.map(s -> Integer.parseInt(s))
.collect(Collectors.toList());
Collections.sort(newList, Collections.reverseOrder());
for(int i : newList)
System.out.println(i);
答案 0 :(得分:0)
您仅在创建的列表中存储标记。您还需要存储其他所需的数据。
您可以创建一个新类,而不是使用List<String>
并转换为List<Integer>
,即:StudentRecord
。该类可能具有用于csv中值的字段,例如标记字段,名称等。然后您可以将它们放入List<StudentRecord>
中。
如果这样做,您的问题将变成“如何根据对象的字段之一对对象列表进行排序?”您可以使用Comparator或Comparable界面来决定如何对它们进行排序。
要查看有关如何使用这些接口的许多示例,可以使用Google“ java比较器示例”或“ java可比较示例”。
答案 1 :(得分:0)
尝试一下,这至少应该给您一个开始(我没有用于测试的CSV):
//Loading file into a List
String splitBy = ",";
String line="";
List<List<String>> marks = new ArrayList<>();
BufferedReader br = new BufferedReader(new FileReader("Student_Records.csv"));
while((line = br.readLine()) != null){
String[] b = line.split(splitBy);
//System.out.println(b[5]+" && "+b[6]);
marks.add(Arrays.asList(b));
}
//Creating the comparator
Comparator<List<String>> comp = new Comparator<List<String>>() {
public int compare(List<String> marksLine1, List<String> marksLine2) {
return Integer.valueOf(marksLine1.get(7)).compareTo(Integer.valueOf(marksLine2.get(7))); //Change the 7s to the column index you want to sort by (I assume 7 is your marks column)
}
};
//Sorting using the comparator
Collections.sort(marks, comp);
//Printing the sorted csv
for(List<String> i : marks)
System.out.println(i.toString());
//Close the BufferedReader
br.close();
我使用List而不是ArrayList,以便它可以保存整个csv数据。除非您将ArrayList包装在另一个列表中,否则它只能容纳一行。基本上,第一个列表将数据水平保存,然后,您需要包装第二个列表来垂直保存数据。
此外,我创建了一个自定义比较器,您可以在其中进行编辑以根据需要对其进行排序。如果您尝试这样做,可能还需要抛出或捕获IOException。