0

我有一个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 方法,但它似乎适用于整数/字符串数据列表,而不适用于对象列表(如我的情况)。

请建议。

4

7 回答 7

3

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

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

于 2012-07-25T09:43:51.997 回答
3

1.如果您希望每个列表具有唯一 uName值,那么您可以使用TreeSetfromjava.util.CollectionInterface Comparator from java.util.Comparator

2.如果您想合并两个列表并具有唯一的 uName,则合并两个列表,然后使用TreeSetand Comparator

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

于 2012-07-25T09:44:47.937 回答
2

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

AbstractCollection,这是大多数List实现(包括ArrayListcontains()其实现中removeAll使用的基础。ArrayList实现contains依赖indexOf(),最后使用equals().

您可以equals()在您的Student类中实现以指定当且仅它们的字段相等时 anStudent等于另一个。uName

请注意,它equals具有相关的语义(参见它的javadoc),在选择如何实现它时应该小心。考虑当两个学生实例的uNames 相等时,他们是否真的代表同一个学生。在我看来,这听起来像是一个非常具体的要求,即如何整理这些东西,并且不应该影响类的语义。

使用@AlexR@KumarVivekMitra的方法会更好。

于 2012-07-25T09:42:13.480 回答
2

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

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

其次,在你的类上实现hashCode()和委托:equals()StudentsuName

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.

于 2012-07-25T09:46:27.110 回答
0

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

于 2012-07-25T09:47:55.783 回答
0

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

另请注意,在某个集合中维护的所有对象都应覆盖这些方法,因此您始终知道它们是如何比较的。

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

树立榜样

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

或者您可以使用自定义比较器而不是覆盖哈希码和等于,但如果您希望您的学生始终是唯一的,您应该覆盖它们

于 2012-07-25T09:50:10.963 回答
0

一个完整的工作解决方案可能如下。

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 );
于 2012-07-25T09:51:06.500 回答