簡體   English   中英

Java刪除2個ArrayList對象之間的公共元素

[英]Java Remove common elements between 2 ArrayList of objects

我有一個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方法的信息,但它似乎適用於整數/字符串數據列表,而不適用於對象列表(如我的情況)。

請提出建議。

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

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

1.如果您希望每個列表中具有獨特的 uName值,那么你可以使用TreeSetjava.util.Collection接口一起Comparator ,從java.util.Comparator

2.如果要合並兩個列表並具有唯一的uName ,請合並兩個列表,然后使用TreeSetComparator

3. Comparator提供了多種方式進行比較靈活性 ...

如果List的對象正確實現equals()則仍可以使用removeAll

AbstractCollection是大多數List實現(包括ArrayList contains()它在removeAll實現中使用contains() ArrayList contains實現依賴於indexOf() ,后者最后使用equals()

您可以在Student類中實現equals() ,以在只有uName字段相等的情況下,指定Student等於另一個Student

請注意, equals具有關聯的語義(請參閱其javadoc ),並且在選擇實現方式時應該小心。 考慮兩個學生實例在uName相等時是否真的代表同一學生。 在我看來,這聽起來像是對如何整理這些東西的非常具體的要求,並且不應影響類的語義。

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

首先,您應該輸入列表:

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

其次,在Students類上實現都委托給uName hashCode()equals()

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.Collection))

您的班級Student應該重寫方法hashcodeequals ,以便您的對象按名稱可以是唯一的。 在這里,您可以閱讀操作方法。

還要注意,某些集合中維護的所有對象都應覆蓋這些方法,因此您始終知道如何比較它們。

在下一步中,您可以使用removeAll方法或帶有Set的解決方案,這取決於您:-)

設置例子

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

或者,您可以使用自定義比較器而不是覆蓋哈希碼和等於,但是如果您希望學生始終是唯一的,則應覆蓋它們

完整的可行解決方案如下。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM