【问题标题】:Java list of objects contained in another list of objects另一个对象列表中包含的 Java 对象列表
【发布时间】:2014-02-17 16:53:18
【问题描述】:

我将一组用户放入一个列表中,然后我将另一组一组用户添加到一个单独的列表中。我正在尝试将第一个对象列表与第二个列表进行比较,并创建一个唯一对象的新列表。

        // List creation (new, old, unique)
        List<User> listNew = new ArrayList<User>();
        List<User> listOld = new ArrayList<User>();
        List<User> listUnique = new ArrayList<User>();

  ...

   for (User unique : listNew) {
        if (!listOld.contains(unique)) {
            listUnique.add(unique);
        }
    }

所以我有这段代码可以做到这一点,但它只是复制了 listNew。我怎样才能将对象相互比较?我的类文件是

public class User {

    private String fName;
    private String mInitial;
    private String lName;
    private String age;
    private String city;
    private String state;

....

【问题讨论】:

  • 你重写了 User 类中的 equals 方法吗?
  • 只需使用Set 类型而不是列表。集合开始时不能有重复项。

标签: java list object contains


【解决方案1】:

您需要在User 类中实现equalshashCode。如果您没有在 User 中实现这些方法,则只有在 listOld 包含与 unique 引用的完全相同的实例时,listOld.contains(unique) 才会返回 true。

检查一下java中身份和平等之间的区别:What is the difference between identity and equality in OOP?

【讨论】:

  • 另外,这里有一个相关教程:tutorials.jenkov.com/java-collections/hashcode-equals.html
  • 在 Eclipse 中,我在 User 类中自动生成了 equalshashCode,但我的小循环似乎仍然没有检测到 new 中有独特的人i> 用户与 用户。自动生成是个坏主意吗?
  • 如果您不了解 Eclipse 生成的代码,是的,这是个坏主意。
【解决方案2】:

集合本质上只有独特的元素,因此这将是在您的情况下使用的正确类型。首先,您需要正确地覆盖 User 类的 hashcode()equals() 方法。之后,只需尝试将所有实例添加到集合并完成它。

Set<User> uniqueUsers = new HashSet<User>();

for (User unique : listNew) {
    if (!listOld.contains(unique)) {
        uniqueUsers.add(unique);
    }
}

【讨论】:

    【解决方案3】:

    正如其他答案所说,您需要覆盖equalshashCode

    您可以使用Collection.removeAll 方法。

    首先,您需要将listNew 包装到确保唯一性的 HasSet 中。

    Collection<User> newUniques = new HashSet<User>();
    newUniques.addAll(listNew);
    newUniques.removeAll(listOld);
    

    现在您的newUniques 将获得所需的结果。

    如果您可以使用 apache commons,ListUtils.removeAll(listNew, listOld) 是另一种选择。

    【讨论】:

    • 我在课堂上自动生成 equalshashCode 并将唯一列表更改为Collection 但是当我按照您的建议执行removeAll 时,它会删除整个列表。也许我创建的对象有问题?
    • 您是否将所有listNew 元素添加到新创建的集合中
    • 是的,我做了newUniques.addAll(listNew);,它填充了与listNew(20,010)中大致相同的数量,我做了一个system.out来检查newUniques的大小,然后我运行@987654336 @ 并且大小变为 0。
    • newUniques.removeAll(listOld); 将从newUniques 中删除listOld 中的所有元素。如果它正在删除所有元素,那么希望listOld中的所有listNew元素或者hashCode或equals中应该有问题
    • 在 Eclipse 中,我右键单击并通过几个菜单自动生成 hashCode 和 equals,所以也许这不是一个好主意。目前,我正在努力创建自己的,但我真的不知道我在做什么,所以我正在使用这个指南:tutorials.jenkov.com/java-collections/hashcode-equals.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多