Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java删除2个ArrayList对象之间的公共元素_Java_Arraylist - Fatal编程技术网

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

Java删除2个ArrayList对象之间的公共元素,java,arraylist,Java,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; t

我有一个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创建两个文件列表

我读过removeAll方法,但它似乎适用于整型/字符串数据列表,而不适用于对象列表(如我的例子)


请建议。

如果
列表中的对象正确实现
equals()
,您仍然可以使用
removeAll

,它是中使用的大多数类型的
列表
实现(包括
ArrayList
)的基础
ArrayList
依赖于
indexOf()
,它最后使用
equals()

您可以在
Student
类中实现
equals()
,以指定一个
Student
等于另一个

请注意,
equals
具有相关的语义(请参见its),在选择如何实现它时应小心。考虑两个学生实例是否真的代表同一个学生,当他们的<代码> unAuth//Case> s相等时。在我看来,这听起来像是一个非常具体的要求,要求如何对这些事情进行分类,并且不应该影响类的语义


使用or的方法会更好。

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


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

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

2.如果希望合并两个列表并具有唯一的uName,则将两个列表合并,然后使用
树集
比较器


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

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

List<Students> studentList1 = new ArrayList<Students>();
现在一切正常


另一个选项是使用
Set
,它只允许由
equals()
方法确定的唯一值。如果将上述方法添加到类中,则可以执行以下操作:

Set<Students> students = new HashSet<Students>();
Set students=newhashset();
然后将你喜欢的东西添加到它中,其中只有唯一的
uName
学生



顺便说一句,你应该用单数命名你的类-即
Student
而不是
Students
你也可以尝试使用apache commons
CollectionUtils.disconction
。(link:,java.util.Collection))

您的学生应该重写方法
hashcode
equals
,这样您的对象可以在名称上是唯一的。你可以阅读如何做到这一点

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

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

以身作则

List List=newarraylist(newhashset(studentList))//这是您的唯一列表


或者,您可以使用自定义比较器,而不是重写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 );
把你的元素放在这些集合中

如果两个集合中都需要唯一的非匹配元素,也可以使用此选项。然后写如下

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

你能提供一个同样的例子吗?同样在我的例子中,我希望比较Students对象的IVAR。请尝试此处解释的代码:Thx非常感谢您的帮助…我如何准确调用removeAll()方法?这都在中,但它只是
list1.removeAll(list2)Thx很多…您能为第二个选项提供一个示例吗(将两个列表合并为唯一的uName)?首先合并两个列表。。。。。。然后把它插入一个树状集合中,树状集合使用了一个比较器来比较学生和他们的非实名学生。。。请参阅这些关于带比较器的树集的示例。。。我现在在工作。。。当我到家时,我会尽力回信