另一个对象列表中包含的Java对象列表

时间:2014-01-26 23:53:13

标签: java list object contains

我有一堆用户已放入列表中,然后我又添加了一组用户,我已将其添加到单独的列表中。我试图将第一个对象列表与第二个列表进行比较,并创建一个新的唯一对象列表。

        // 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;

....

3 个答案:

答案 0 :(得分:3)

您需要在equals课程中实施hashCodeUser。如果您未在User中实施这些方法,listOld.contains(unique)只会在listOld包含与unique引用的完全相同的实例时才返回true。

在java中查看身份和等式之间的区别:What is the difference between identity and equality in OOP?

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

您可以使用Collection.removeAll方法。

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

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

现在您的newUniques会有所需的结果。

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