我有一个Java类
class Students{
private String fName;
private String lName;
private String uName;
public Students(String fName, String lName, String uName) {
this.fName = fName;
this.lName = lName;
this.uName = uName;
}
public String getuName() {
return uName;
}
public void setuName(String uName) {
this.uName = uName;
}
public String getfName() {
return fName;
}
public void setfName(String fName) {
this.fName = fName;
}
public String getlName() {
return lName;
}
public void setlName(String lName) {
this.lName = lName;
}
}
我也用这个
public class TestClass {
public static void main(String[] args) {
Students students1 = new Students("xyz","abc","xyzAbc");
Students students2 = new Students("poi","son","poison");
Students students3 = new Students("yog","jos","yogjos");
Students students4 = new Students("xyz","abc","xyzAbc");
Students students5 = new Students("pon","son","xyzAbc");
Students students6 = new Students("yog","jos","someotherUName");
Students students7 = new Students("yog","jos","someotherUName2");
List studentList1 = new ArrayList();
List studentList2 = new ArrayList();
studentList1.add(students1);
studentList1.add(students2);
studentList1.add(students3);
studentList2.add(students4);
studentList2.add(students5);
studentList2.add(students6);
}
}
现在,我需要一个仅包含唯一的“ uName”值的过滤列表。
因此,我希望每个列表的“ uName”字段之间进行比较,并删除常见的列表。
最后,我需要2个过滤列表,分别用于studentList1和studentList2。
我读到有关removeAll方法的信息,但它似乎适用于整数/字符串数据列表,而不适用于对象列表(如我的情况)。
请提出建议。
最佳答案
如果removeAll
中的对象正确实现了List
,您仍然可以使用equals()
。AbstractCollection
是大多数List
实现(包括ArrayList
)的基础,它在contains()
中使用its implementation of removeAll
。 ArrayList
的implementation of contains
依赖于indexOf()
,最后使用equals()
。
您可以在equals()
类中实现Student
,以指定一个Student
等于另一个,并且仅当它们的uName
字段相等时。
请注意,equals
具有关联的语义(请参见其javadoc),并且在选择实现方式时应格外小心。考虑两个学生实例在uName
相等时是否真的代表同一学生。在我看来,这听起来像是对如何整理这些东西的非常具体的要求,并且不应影响类的语义。
使用@AlexR或@KumarVivekMitra的方法会更好。