我有一堆用户已放入列表中,然后我又添加了一组用户,我已将其添加到单独的列表中。我试图将第一个对象列表与第二个列表进行比较,并创建一个新的唯一对象列表。
// 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;
....
答案 0 :(得分:3)
您需要在equals
课程中实施hashCode
和User
。如果您未在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)
正如其他答案所述,您需要覆盖equals
和hashCode
。
您可以使用Collection.removeAll方法。
首先,您需要将listNew
包装到HasSet中,以确保单一性。
Collection<User> newUniques = new HashSet<User>();
newUniques.addAll(listNew);
newUniques.removeAll(listOld);
现在您的newUniques
会有所需的结果。
如果您可以使用apache commons,ListUtils.removeAll(listNew, listOld)
是另一种选择。