对象的ArrayList,比较对象并找到重复项,在每个重复项中只添加一个对象到新的ArrayList中。

3
我已经想出了如何比较两个ArrayList并将重复项添加到一个新的ArrayList中。
    ArrayList<Student> allStudentsA = assignStudents();
    ArrayList<Student> allStudentsB = allStudentsA;

    for (Student studentA : allStudentsA) {
        for (Student studentB : allStudentsB) {
            if (studentA.getId().equals(studentB.getId()) && studentA.getEduNumber() != studentB.getEduNumber()) {
                duplicateStudents.add(studentB);
            }
        }
    }

然而,我所做的方式是每次只添加一次重复项。因为"Rodaba"出现了7次,她有7个不同的优先级,所以她被添加到列表中7 * 6次。以下是我的打印方式:

    for (Student student : duplicateStudents) {
        if (student.getFornavn().equals("Rodaba")) {
            System.out.println("Name: " + student.getFornavn() + "\t \t" + "EduNumber: " + student.getOptagelsesområde() + "\t" + "Prio: " + student.getPrio());
        }
    }

有没有聪明的方法可以避免这种情况,只为她申请的每个优先级添加“Rodaba”一次? 这是我的输出,有没有办法只获取标记部分? 这是我的输出,有没有办法只获取标记部分 我已经被卡了很长时间。我真的很感激对更好地制作ArrayLists的建议,以及如何解决这个问题的建议。

我认为使用 Map 可能是一个不错的解决方案。同时,它也消除了嵌套的 for 循环。 - Rohit Mourya
@Nathan 这个问题在于学生将会在列表中出现_n_次,其中_n_是他们拥有的优先级数量。 - Lars Christensen
@LarsChristensen 然后,只需检查它是否以相同的优先级存在于列表中。 - Turtle
如果你不想将逻辑更改为更快的映射(甚至是具有正确等式的list.contains),为什么不在添加之前将Priority添加到if条件中呢? - Zeromus
使用集合来解决这个问题。 - SedJ601
显示剩余3条评论
2个回答

3
正如我在评论中指出的那样,在添加学生之前,您可以简单地检查是否存在一个学生:
ArrayList<Student> allStudentsA = assignStudents();
ArrayList<Student> allStudentsB = allStudentsA;

for (Student studentA : allStudentsA)
    for (Student studentB : allStudentsB)
        if (studentA.getId().equals(studentB.getId())
            && studentA.getEduNumber() != studentB.getEduNumber())
            if (!duplicateStudents.contains(studentB))
                duplicateStudents.add(studentB);

请注意,这只有在您覆盖了Student类的equalshashCode方法时才有效,因为对象没有相同的引用。
基本上,您将在将学生加入列表之前检查是否已经存在该Student。如果您正确地实现了equals方法,则一个学生不等于另一个具有不同优先级的

再次出现的问题是,当程序遇到第一个学生时它就停止添加了。因此,它只在第25个优先级上添加“Rodaba”一次,而我想要的是为每个优先级添加一次。 - Lars Christensen
@LarsChristensen 然后它会退回到你的 Student#equals 实现:似乎你的 equals 方法即使优先级不同也会返回 true。 - Turtle
你是个神一样的 Nathan,问题就出在那里。我编辑了我的 equals 方法以正确检查优先级,问题得到了解决。 - Lars Christensen
@LarsChristensen 很高兴我能帮忙,但是我不能接受神的称号——这个荣誉应该归功于Jon Skeet,SO的Chuck Norris :D - Turtle

1
您可以使用流的不同方法。例如:
List<Student> allStudentsA = assignStudents();
List<Student> duplicateStudents = allStudents.stream()
    .collect(groupingBy(Student::getId)) 
//Now you've got Map<String, List<Student>> (assuming id is of type String).
//Id of an user is a key. In value (list) you have all Students with the same id.
//Now we want to take this lists which have size greater than two and merge them.
    .values()
    .stream()
    .filter(list -> list.size() >= 2)
    .flatMap(List::stream)
    .collect(Collectors.toList());

改进是受欢迎的。

1
感谢您提供的另一种方法。 - Lars Christensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接