如何从存储多属性Person对象的Java ArrayList中提取并打印不重复姓名
自定义对象列表的去重姓名输出实现
你之前搜到的简单类型列表去重方案不适用,核心原因是:那些示例是直接对列表存储的元素本身做去重,而实际需求是对列表元素的某一个字段值做去重,全程不需要改动原有自定义类的逻辑,直接提取字段值再做去重即可。
方案1:Java 8+ Stream流实现(代码最简洁,天然保序)
在原有main方法的列表初始化完成后,直接追加以下代码即可:
people.stream() // 从每个Person实例中提取姓名字段 .map(Person::getName) // 对提取出的姓名字符串执行去重 .distinct() // 逐行在控制台打印 .forEach(System.out::println);
运行后输出结果严格按照姓名首次出现的顺序排列,依次为Paul、Sabrina、Max,完全匹配需求。
方案2:传统遍历+Set去重(兼容Java 8之前的低版本环境)
利用Set集合不存储重复元素的特性,逐一遍历列表提取姓名,自动过滤重复值:
// 用LinkedHashSet保证姓名输出顺序和首次出现的顺序一致,避免普通HashSet的乱序问题 Set<String> uniqueNames = new LinkedHashSet<>(); for (Person person : people) { uniqueNames.add(person.getName()); } // 遍历打印去重后的姓名 for (String name : uniqueNames) { System.out.println(name); }
注意:以上两种方案都完全不需要改动原有Person类的代码,也不需要为了适配去重重写
equals()和hashCode()方法——因为我们去重处理的对象是提取出来的字符串类型姓名,不是Person实例本身,刚好绕开了自定义对象列表去重需要重写方法的繁琐步骤。
内容的提问来源于stack exchange,提问作者HStoltz
相关产品推荐
相关产品推荐

