有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从两个自定义对象列表中删除公共元素

在下面的代码中,我有两个图像对象列表(fromTagList和fromImageList)。image类具有一个属性image 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) 个答案

  1. # 1 楼答案

    每当需要维护UNIQ元素时,请考虑使用set & lt;gt;。java中的set接口专门用于处理uniq元素。您可以按照以下方法将列表转换为集合:

    重写image对象的equals和hashcode方法(仅使用url属性作为equality和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);
    

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

  2. # 2 楼答案

    。移除(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);
    

    如果你想支持重复元素的列表,我不认为你可以边删除边删除。我建议在新的元素列表中添加要删除的元素

  3. # 3 楼答案

    是的,你确实有索引的问题,问题是当你从列表中删除一些东西时,比如在位置i=10,位置11的元素将在第10位,而我将在11位,所以你会错过这个元素,第二个问题是当你从第二个列表中删除k indexer时,你应该打破,为了不处理所有的rest元素(除非找到的元素不重复),在尝试代码之后,我给出了以下答案:

    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
                    }
                }
            }
    
  4. # 4 楼答案

    我会编一本字典。反复浏览每个列表(分别)。对于每个对象,将其推送到字典上,键为其URL。这样,具有相同URL的任何对象都将在字典中显示为一个键值对。将所有内容添加到词典后,将词典转换为列表