使用compareTo从ArrayList中删除重复项

时间:2018-05-04 08:09:34

标签: java arraylist duplicates

我试图创建一个对象的ArrayList Edge,没有任何重复:

public class Edge implements Comparable<Edge>{
    private int vertex1, vertex2;
    //constructor, getter ...
    @Override
    public int compareTo(Edge o) {
        if (vertex1 == o.getVertex1() && vertex2 == o.getVertex2()) return 0;
        return 1;
    }
}

我认为使用不接受重复的HashSet会有效,但我错了:

ArrayList<Edge> edges = new ArrayList<Edge>();
//fill list (with possible duplicates)

//delete duplicates
Set<Edge> hs = new HashSet<Edge>();
hs.addAll(edges);
edges.clear();
edges.addAll(hs);

此方法适用于String,Integer的ArrayList,但我不明白为什么它不适用于这种情况。

对不起我的英语,我是法国人。

4 个答案:

答案 0 :(得分:4)

您有两种选择:

    如果您想使用equals()或,请
  • 覆盖hashcode()HashSet
  • 使用依赖TreeSet的{​​{1}}来确定是否存在重复项。

因此,在您的代码中,只需将compareTo替换为:

Set<Edge> hs = new HashSet<Edge>();

它将按预期工作。请注意,Set<Edge> hs = new TreeSet<Edge>(); compareTo不一致的事实可能会产生其他问题,因此只有在您了解自己在做什么的情况下才能这样做。更多信息,请参见ComparableTreeSet的javadoc。

答案 1 :(得分:0)

您的对象具有不同的哈希值,因此HashSet将其放在不同的括号中。

当您覆盖equals时,您也应该覆盖hashCode

等于对象必须具有相同的hash

答案 2 :(得分:0)

覆盖hashCodeequals方法

public class Edge implements Comparable<Edge>{
    private int vertex1, vertex2;
    //constructor, getter ...
    @Override
    public int compareTo(Edge o) {
        if (vertex1 == o.getVertex1() && vertex2 == o.getVertex2()) return 0;
        return 1;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + vertex1;
        result = prime * result + vertex2;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Edge other = (Edge) obj;
        if (vertex1 != other.vertex1)
            return false;
        if (vertex2 != other.vertex2)
            return false;
        return true;
    }
}

答案 3 :(得分:0)

这个怎么样:

public List<Edge> removeDuplicates(List<Edge> fullList) {

    List<Edge> noDuplicates = new ArrayList<>();

    for (Edge edge : fullList){
        if (!fullList.contains(edge))
            noDuplicates.add(edge);
    }

    return noDuplicates;
}

对我来说工作正常,可以从列表中删除重复的对象!