簡體   English   中英

如何比較兩個列表?

[英]How do I compare two lists?

CompareList removedList = new CompareList();
CompareList addedList = new CompareList();

這就是我在里面添加元素的方式

addedList.add(new Objec("Var_a", "1"));

Objec類有兩個字符串。

我該如何比較? 我不能像字符串ArrayList那樣使用包含?

在CompareList中,我有

public boolean equals(CompareList l) {

    if (l.containsAll(this)) {
        if (this.containsAll(l)) {
            return true;
        }
    }
    return false;
}

和在Objec

public Objec(String n, String s) {
    this.name=n;
    this.surname=s;
}

public String toString() {
    return " Name: " + name +  ", Surname: " + surname;
}

我看到很多人對我的問題感到困惑。 那我想要什么?

清單1:

薩米·喬(Samy Joe)
艾瑪比
朱莉婭·羅伯

清單2:

薩米·喬(Samy Joe)
艾瑪比
安娜·斯凱

刪除了Julia Rob並添加了Anna Sky。 但是,當我的列表包含具有兩個字符串的對象時,我不知道該怎么辦?

這段代碼比較列表是否相等,即是否包含相同的元素。

static boolean same(Collection<?> a, Collection<?> b) {
    if (a.size() != b.size()) {
        return false;
    }
    List<?> c = new ArrayList<>(a);
    c.removeAll(b);
    return c.isEmpty();
}
  • 如果大小不相等,則列表永遠不相等。
  • 否則,如果大小相等,則我們知道兩個列表都包含一個或多個元素,而這些元素在另一個列表中不存在。 因此,我們從其中一個列表中創建了一個新列表(本例中為a ),然后刪除b的元素。

您不需要使用自己的類CompareList ,而是可以使用ArrayList東西。

為了將Objec與另一equals(Object)進行比較,您需要正確實現equals(Object)hashCode()


如果您想知道其他列表中未包含哪些元素,則可以使用以下方法:

static HashMap<Collection<?>, Collection<?>> disjoints(Collection<?> a, Collection<?> b) {
    List<?> aa = new ArrayList<>(a);
    aa.removeAll(b);
    List<?> bb = new ArrayList<>(b);
    bb.removeAll(a);

    HashMap<Collection<?>, Collection<?>> map = new HashMap<>();
    map.put(a, aa);
    map.put(b, bb);
    return map;
}

它返回一個映射,該映射具有兩個集合作為鍵,並且由鍵指定的集合的元素作為值(未包含在另一個集合中)。 例如,如果你想知道的元素a不存在的b ,然后調用disjoints(a, b).get(a)

注意:之所以稱為列表集合,是因為它們是。 在Java中, ListCollection的子類型。

您需要像這樣在自定義對象中覆蓋equals方法:

public class MyObject {
     private String name;
     private String surname;

    @Override
    public boolean equals(MyObject myObject) {
         // assert that name and surename can not be null or check for this
         if (!this.name.equals(myObject.name)) {
             return false;
         }

         if (!this.surname.equals(myObject.surname)) {
             return false;
         }

         return true;
    }
}

列表的contains-Method將使用equals方法檢查對象的相等性。

但是@Prakash發布的鏈接是更好的方法。 我認為沒有人了解您對CompareList的關注以及為什么使用自定義的;)

編輯 :對不起,簽名有誤。

@Override
    public boolean equals(Object obj) {
        if (!(obj instanceof MyObject) {
            return false;
        }
        // else cast and use code above
    }

您的問題是:“我該如何比較?”

首先要記住的是,您可以通過兩種方式進行比較。 所以首先考慮一下。

平等:比較平等時

使用equals()並在實現時實現hashCode()。

比較/排序:什么時候將2個對象視為比另一個低,相同或高?

實現“可比較”接口並覆蓋compareTo。

您發布的內容包含equals(),因此可以說這就是您想要做的。 如果要使用containsAll(),請記住,它使用列表包含的類中的equals來計算返回true / false。 因此,您可能應該:

將equals()添加到“ Objec”類。

暫無
暫無

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

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