【问题标题】:Java 8: Compare elements in ArraylistJava 8:比较 Arraylist 中的元素
【发布时间】:2018-06-04 04:38:17
【问题描述】:

我有一个ArrayList学生
如何有效地比较列表中的所有元素,以确保没有两个元素具有相同的 ssnlName 值?

ArrayList<Student> students = getStudents();

public class Student { 
    private String id;
    private String fName;
    private String lName;
    private String ssn;
}

【问题讨论】:

  • 这是两个独立的问题,比较元素并确保没有重复的 ssn。你想要containsDuplicateSSN这样的方法吗?
  • 其实只需要保证没有重复的ssn、lName值
  • 学生是否存储在数据库中?
  • @ShanuGupta 不,arrayList 是用户输入

标签: java arraylist java-8 stream java-stream


【解决方案1】:

Stream API 的 distinct() 方法需要重写 Student 类中的 equals() 和 hashcode() 方法。

students.stream().distinct().collect(Collectors.toList());

【讨论】:

  • 关于ArrayList的问题。
  • students.stream().distinct().collect(Collectors.toList());你需要重写equals方法。
  • 已更新。你需要在你的学生类中实现 hashcode() 和 equals()。
【解决方案2】:

您可以构造一个键为ssn 的映射。这里Collectors.toMap如果遇到重复会抛出IllegalStateException

students
      .stream()
      .collect(Collectors.toMap(Student::getSsn, Function.identity()));

或者你可以在合并函数中处理它

students
        .stream()
        .collect(Collectors.toMap(Student::getSsn, Function.identity(), (student1, student2) -> {
                System.out.println(student1 + " and " + student2 + " had duplicate SSNs");
                return student1; //Just for demonstration I'm returning the first one.
            }));

以上内容将帮助您识别重复项,但您没有提到之后要做什么。

编辑(基于问题的更新):

.. 但我需要确保 lName 值也是唯一的

您可以执行上述操作两次 - 一次用于 SSN,一次用于姓氏。

或者您可以覆盖 equalshashCode,如另一个答案所示。

【讨论】:

  • 想做这样的事情,但我需要确保 lName 值也是唯一的
  • @usr1234 那么,SSN 和 LastNames 都必须是唯一的吗?
  • 是的!我从 API 中的用户请求获取数组列表,我需要验证每个元素中的 lastName 和 ssn 值是否唯一,如果不是则抛出异常
  • @usr1234 我希望永远不会遇到要求学生拥有唯一姓氏的现实学校......
  • @Holger 我希望如此;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
相关资源
最近更新 更多