如何使用Java中的特定列对csv文件中的记录进行排序

时间:2019-05-01 14:07:11

标签: java

我正在从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);

2 个答案:

答案 0 :(得分:0)

您仅在创建的列表中存储标记。您还需要存储其他所需的数据。

您可以创建一个新类,而不是使用List<String>并转换为List<Integer>,即:StudentRecord。该类可能具有用于csv中值的字段,例如标记字段,名称等。然后您可以将它们放入List<StudentRecord>中。

如果这样做,您的问题将变成“如何根据对象的字段之一对对象列表进行排序?”您可以使用ComparatorComparable界面来决定如何对它们进行排序。

要查看有关如何使用这些接口的许多示例,可以使用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。