我试图创建一个对象的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,但我不明白为什么它不适用于这种情况。
对不起我的英语,我是法国人。
答案 0 :(得分:4)
您有两种选择:
equals()
或,请hashcode()
和HashSet
TreeSet
的{{1}}来确定是否存在重复项。因此,在您的代码中,只需将compareTo
替换为:
Set<Edge> hs = new HashSet<Edge>();
它将按预期工作。请注意,Set<Edge> hs = new TreeSet<Edge>();
与compareTo
不一致的事实可能会产生其他问题,因此只有在您了解自己在做什么的情况下才能这样做。更多信息,请参见Comparable和TreeSet的javadoc。
答案 1 :(得分:0)
您的对象具有不同的哈希值,因此HashSet
将其放在不同的括号中。
当您覆盖equals
时,您也应该覆盖hashCode
。
等于对象必须具有相同的hash
答案 2 :(得分:0)
覆盖hashCode
和equals
方法
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;
}
对我来说工作正常,可以从列表中删除重复的对象!