如何从存储Model类对象的ArrayList中按姓名筛选元素并分类存储
你原有写法的错误主要是两点:
- 全量列表存储的是
Model对象,直接调用contains("Joker")传入字符串永远匹配失败 - 没有在循环中逐个获取每个
Model实例的name属性做匹配判断,也没有对不匹配的元素做分类存储。
实现步骤
1. 补充Model类的toString方法
要实现你需要的打印效果,首先需要在Model类中重写toString方法,自定义输出格式:
public class Model{ String name; int age; public Model(){} public Model(String name, int age){ this.name = name; this.age = age; } //已生成name和age对应的getter、setter方法 // 新增toString方法 @Override public String toString() { return "name = " + name + " age = " + age; } }
2. 正确的分类逻辑实现
普通遍历写法(兼容性最好)
// 定义需要匹配的犯罪人员姓名集合,统一转小写实现大小写不敏感匹配 Set<String> crimeNameSet = new HashSet<>(Arrays.asList("joker", "morris")); List<Model> crimeList = new ArrayList<>(); List<Model> normalList = new ArrayList<>(); for (Model item : arrayList) { // 取当前元素姓名转小写后匹配 if (crimeNameSet.contains(item.getName().toLowerCase())) { crimeList.add(item); } else { normalList.add(item); } }
Java8+ Stream写法(更简洁)
Set<String> crimeNameSet = new HashSet<>(Arrays.asList("joker", "morris")); // 用partitioningBy直接将列表按匹配规则分成两组 Map<Boolean, List<Model>> classifyMap = arrayList.stream() .collect(Collectors.partitioningBy(item -> crimeNameSet.contains(item.getName().toLowerCase()) )); List<Model> crimeList = classifyMap.get(true); List<Model> normalList = classifyMap.get(false);
3. 打印输出
直接打印两个列表即可得到你需要的效果:
System.out.println("Crime list " + crimeList); System.out.println("Normal List " + normalList);
内容的提问来源于stack exchange,提问作者James Bond
相关产品推荐
相关产品推荐

