簡體   English   中英

從兩個自定義對象列表中刪除通用元素

[英]Removing common elements from two lists of custom objects

在下面的代碼中,我有兩個圖像對象列表(fromTagList和fromImageList)。 圖像類具有屬性圖像URL。 這兩個列表中都有共同的對象。

我的目標是根據URL屬性來檢測這些公共元素,並將其從兩個列表中刪除,以便兩個列表將包含不同的元素,然后將兩個列表與一個列表合並,以便此合並的列表將包含不同的對象。 問題是我使用的以下方法並未刪除所有常見元素,因為我認為這樣會跳過一些索引。

for (int i = 0; i < fromTagList.size(); i++) {
    for (int k = 0; k < fromImageList.size(); k++) {
        if (fromTagList.get(i).getImageURL().equals(fromImageList.get(k).getImageURL())) {
            fromTagList.remove(i);
            fromImageList.remove(k);
        }
    }
}

.remove(index)刪除了元素,這使列表更短,但是您的索引沒有考慮該元素,並繼續添加1,但是實際上跳過了2個元素(+1和刪除的元素)。

這適用於內聯刪除重復的元素,但是當一個列表包含重復的元素時失敗。 它適用於列表中沒有重復元素的情況,因為我向后瀏覽這些元素。 請注意標記為繼續。

//the new ArrayList is needed so remove is supported
    List<String> fromTagList = new ArrayList(Arrays.asList(new String[] {"a", "b", "c", "1", "2", "3"}));
    List<String> fromImageList = new ArrayList(Arrays.asList(new String[] {"b", "b", "c", "d", "2", "3", "4"}));

    outer: for (int i = fromTagList.size()- 1; i >= 0; i--) {
        for (int k = fromImageList.size() - 1; k >= 0; k--) {
        System.out.println("i: " + i + " k: " + k);
        if (fromTagList.get(i).equals(fromImageList.get(k))) {
            fromTagList.remove(i);
            fromImageList.remove(k);
            continue outer;
        }
        }
    }

    System.out.println("fromTag  : " + fromTagList);
    System.out.println("fromImage: " + fromImageList);

如果您想支持包含重復元素的列表,我認為您不能隨便刪除。 我建議添加到要刪除的新元素列表中。

我會創建一個字典。 遍歷每個列表(單獨)。 對於每個對象,將其作為URL推入字典。 這樣,任何具有相同URL的對象都將在字典中顯示為一對鍵值對。 將所有內容添加到字典后,將字典轉換為列表。

是的,您確實有一個索引問題,問題是當您從列表中刪除某項內容時,例如在位置i = 10處,位置11的元素將排在第10位,而我將在11位,因此您將錯過此元素,第二個問題是,當您從第二個k索引器列表中刪除時,應該中斷操作,以不處理所有其余元素(除非找到的元素不重復),因此這是在嘗試您的代碼后對我有用的答案:

for (int i = 0; i < fromTagList.size(); i++) {
            for (int k = 0; k < fromImageList.size(); k++) {
                if (fromTagList.get(i).getImageURL().equals(fromImageList.get(k).getImageURL())) {
                    fromTagList.remove(i);
                    fromImageList.remove(k);
                    i--;
                    //break; this is optional
                }
            }
        }

每當需要維護uniq元素時,請考慮使用Set <>。 java中的set接口專門用於處理uniq元素。您可以按照以下方法將列表轉換為set:

覆蓋圖像對象的equals和hashcode方法(僅將url屬性用作相等性和hascode的條件)。 現在將兩個列表都添加到集合中。 將設置轉換回列表,瞧! 例:

 class ImageObj {

    String url;
    //rest of the stuff

    @Override
    public boolean equals(Object o){
    ImageObj that = (ImageObj)o;
    return that.url.equals(this.url);
    }
    @Override
    public int hascode(){
    return Objects.hascode(this.url);
    }
    }
    }

然后 -

Set<ImageObj> set= new HashSet<ImageObj>(fromTagList);
set.addAll(fromImageList);

List<ImageObj> list = new ArrayList<ImageObj>(set);

這是您包含所有唯一對象的最終列表。

暫無
暫無

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

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