从两个自定义对象列表中删除通用元素

时间:2019-05-10 19:31:08

标签: java android list object

在下面的代码中,我有两个图像对象列表(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);
        }
    }
}

4 个答案:

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

这是您包含所有唯一对象的最终列表。