java - 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);
}
}
问题是当我尝试运行程序时,它只会按照与读取的文件相同的顺序打印出值。它不对它进行排序。我试图找出代码有什么问题以及如何更正它以便排序方法起作用。您的帮助将不胜感激。谢谢!
解决方案
流不会修改您现有的列表,它会在您调用时创建一个新列表collect()
。您需要做的是将此方法的结果分配给您的列表变量:
list = list.stream()
.sorted(Comparator.comparing(Citizen::getLastName))
.collect(Collectors.toList());
或者:
return list.stream()
.sorted(Comparator.comparing(Citizen::getLastName))
.collect(Collectors.toList());
推荐阅读
- c# - 按具有分页的公共属性对对象的动态列表进行排序
- arrays - 如果Google表格中的值等于0,如何计算损失
- python - 如何创建一个用 Python 流式传输在线广播的不和谐机器人
- python - Python3.7 在 linux 上的模块加载期间未显示
- javascript - 关于 CDN。这些方法在哪里起作用?客户?断绝?
- pandas - 如何使用 Pandas 转换日期时间格式
- c - 为什么我在运行此代码时收到无效指针错误
- javascript - Javascript没有获取文本字段值
- d3.js - d3js强制有向图箭头不显示
- c# - 如何在nHibernate中映射一个继承asbtract类并同时实现接口的calss?