首页 > 解决方案 > Stream API 排序和过滤有问题

问题描述

我有一个 Citizen 类,其中包含我正在使用的参考类。我想要做的是将我从文件中读取的数据传递给 Citizen 类,将这些数据存储到数组或列表中,并使用流 api 对其进行排序

这是我目前正在做的事情

readCSV 方法读取 data.csv 文件,将其传递到引用类中并将其添加到列表中:

public static ArrayList<Citizen> readCSV(String datafile) throws FileNotFoundException {
    ArrayList<Citizen> citizenList = new ArrayList<>();
    String contents;
    BufferedReader brd = new BufferedReader(new FileReader(datafile));
    try {
        while ((contents = brd.readLine()) != null) {
            String[] st = contents.split(",(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)");
            String firstName = st[1];
            String lastName = st[0];
            String email = st[2];
            String address = st[3];
            int age = Integer.parseInt(st[4]);
            boolean resident = false;
                if ((st[5].compareToIgnoreCase("Resident")  == 0)) {
                    resident = true;
                }
            int district = Integer.parseInt(st[6]);
            String gender = st[7];
                if (st[7].compareToIgnoreCase("Female") == 0) {
                    gender = "female";
                } else if (st[7].compareToIgnoreCase("Male") == 0) {
                    gender = "male";
                }

            citizenList.add(new Citizen(lastName, firstName, email, address, age, resident, district, gender));
        } // end of while loop
    } // end of try
    catch (Exception e) {
        System.out.println("File not found:" + e.getMessage());
    } // end of Catch
    return citizenList;
}// end of ReadFile method

这是应该对读取文件中的数据进行排序的方法:

  public static List<Citizen> getName(List<Citizen> citizens, String path) throws FileNotFoundException {
    ArrayList<Citizen> list = readCSV(path);
    Citizen foundCitizen = new Citizen();

    list.stream().sorted(Comparator.comparing(Citizen::getLastName)).collect(Collectors.toList());

    return list;

这是我在 main 方法中调用的 print 方法。此方法将调用 getName 方法并打印排序后的值:

public static void printName(List<Citizen> citizens, String path) throws FileNotFoundException {
    ArrayList<Citizen> shitizen = new ArrayList<>(getName(readCSV(path), path));
    for (Citizen e : shitizen) {
        System.out.println(e);
    }
}

问题是当我尝试运行程序时,它只会按照与读取的文件相同的顺序打印出值。它不对它进行排序。我试图找出代码有什么问题以及如何更正它以便排序方法起作用。您的帮助将不胜感激。谢谢!

标签: javasortingjava-stream

解决方案


流不会修改您现有的列表,它会在您调用时创建一个新列表collect()。您需要做的是将此方法的结果分配给您的列表变量:

list = list.stream()
           .sorted(Comparator.comparing(Citizen::getLastName))
           .collect(Collectors.toList());

或者:

return list.stream()
           .sorted(Comparator.comparing(Citizen::getLastName))
           .collect(Collectors.toList());


推荐阅读