在下面的代码中,我有两个图像对象列表(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);
}
}
}
答案 0 :(得分:1)
.remove(index)删除了元素,这会使列表更短,但是您的索引没有考虑该元素,并继续添加1,但实际上跳过了2个元素(+1和删除的元素)。 / p>
这适用于内联删除重复的元素,但是当一个列表包含重复的元素时失败。它适用于列表中没有重复元素的情况,因为我向后浏览这些元素。请注意标有继续的标签。
//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);
如果您要支持包含重复元素的列表,我认为您不能随便删除。我建议添加到要删除的新元素列表中。
答案 1 :(得分:0)
我会创建一个字典。遍历每个列表(单独)。对于每个对象,将其作为URL推入字典。这样,任何具有相同URL的对象都将在字典中显示为一对键值对。将所有内容添加到字典后,将字典转换为列表。
答案 2 :(得分:0)
是的,您确实有一个索引问题,问题是当您从列表中删除某项内容时,例如在位置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
}
}
}
答案 3 :(得分:0)
每当需要维护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);
这是您包含所有唯一对象的最终列表。