[英]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.