Java移除对象的2个ArrayList之间的公共元素



我有一个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"字段,并删除常见的字段。

最后,我想要studentList1和studentList2的2个过滤列表。

我读过removeAll方法,但它似乎适用于ListofInteger/String数据,而不适用于List of Objects(在我的情况下)。

您可以将您的列表设置好,然后(如果需要)将其收回:

new ArrayList(new HashSet<String>(list))创建的列表只包含源列表中的唯一元素。

1。如果您希望每个列表都有唯一的uName值,那么您可以使用java.util.Collection中的TreeSet以及java.util.Comparator中的接口Comparator

2.如果要合并两个列表并具有唯一的uName,请合并两个名单,然后使用TreeSetComparator

3.Comparator提供了以多种方式进行比较的灵活性。。。

如果List中的对象正确实现了equals(),则仍然可以使用removeAll

AbstractCollection是大多数类型的List实现(包括ArrayList)的基础,它在removeAll的实现中使用contains()ArrayListcontains的实现依赖于indexOf(),后者最后使用equals()

您可以在Student类中实现equals(),以指定一个Student等于另一个,如果并且只有它们的uName字段相等。

请注意,equals有相关的语义(请参阅其javadoc),在选择如何实现它时应该小心。考虑两个学生实例在uName s相等时是否真的代表同一个学生。在我看来,这听起来像是一个关于如何将这些东西分类的非常具体的要求,不应该影响类的语义。

使用@AlexR或@KumarVivekMitra的方法,你会过得更好。

首先,您应该键入您的列表:

List<Students> studentList1 = new ArrayList<Students>();

其次,在Students类上实现hashCode()equals(),这两个类都委托给uName:

public boolean equals(Object o) {
    return o instanceof Students && ((Students)o).uName.equals(uName);
}
public int hashCode() {
    return uName.hashCode();
}

现在removeAll()可以正常工作了。


另一种选择是使用Set,它只允许由equals()方法确定的唯一值。如果你把上面的方法添加到你的类中,你可以这样做:

Set<Students> students = new HashSet<Students>();

然后添加你喜欢的内容,就会有唯一的uName学生。


顺便说一句,你应该用单数来命名你的类,即Student而不是Students

您也可以尝试使用apache commons CollectionUtils.disjunction。(链接:http://commons.apache.org/collections/apidocs/org/apache/commons/collections/CollectionUtils.html#disjunction(java.util.Collection,java.util.Cllection))

您的类Student应该覆盖方法hashcodeequals,这样您的对象的名称就可以是唯一的。在这里你可以阅读如何做到这一点。

还要注意,在某个集合中维护的所有对象都应该覆盖这些方法,这样您就可以随时了解它们是如何进行比较的。

在下一步中,您可以使用removeAll方法或Set的解决方案,这取决于您:-)

设置示例

List<String> list = new ArrayList(new HashSet<String>(studentList));//这是您的唯一列表

或者,您可以使用自定义Comparator,而不是覆盖hashcode和equals,但如果您希望您的学生始终是唯一的,则应该覆盖它们

完整的工作解决方案如下。

Class Student{

.....
......
.....
   public boolean equals(Object o) {
       return o instanceof Students && ((Students)o).uName.equals(uName);
   }
   public int hashCode() {
       return uName.hashCode();
   }


}

Set studentList1 = new hashSet();
Set studentList2 = new hashSet();

将元素放入这些集合中。

如果希望在两个集中都有唯一的不匹配元素,也可以。然后写如下。

studentList1.removeAll(studentList2 );

最新更新