我有一个类"Accumulator",它实现了Comparable compareTo方法,我试图将这些对象放入HashSet中.
当我向HashSet添加()时,我在调试器中的compareTo方法中看不到任何活动,无论我在哪里设置断点.另外,当我完成add()时,我在Set中看到了几个重复项.
在这里,我搞砸了什么; 为什么不比较,因此允许欺骗?
谢谢,
IVR复仇者
在下面的代码中,我在哈希集中添加了 5 个具有相同数据的对象,我想消除具有重复数据的对象并打印不同的对象数据。
public static void main(String[] args) {
Employee emp1 = new Employee(1,"sandhiya","cse",22);
Employee emp2 = new Employee(1,"sandhiya","cse",22);
Employee emp3 = new Employee(1,"sandhiya","cse",22);
Employee emp4 = new Employee(1,"sandhiya","cse",22);
Employee emp5 = new Employee(1,"sandhiya","cse",22);
HashSet<Employee> emps = new HashSet<Employee>();
emps.add(emp1);
emps.add(emp2);
emps.add(emp3);
emps.add(emp4);
emps.add(emp5);
for(Employee e: emps){
System.out.println(e.id + " "+e.name+" "+e.department+ " "+e.age);
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个HashSet,它在Graph中存储了一些边.每个Edge都有两个节点.
在图表未定向的情况下,添加副本应该失败:
Edge a = new Edge(new Node("aa"), new Node("bb"));
Edge duplicate = new Edge(new Node("aa"), new Node("bb"));
Run Code Online (Sandbox Code Playgroud)
但是在下面的例子中它起作用:
System.out.println(a.equals(duplicate));
Set<Edge> sete = new HashSet<Edge>();
System.out.println(sete.contains(a));
System.out.println(sete.add(a));
System.out.println(sete.contains(duplicate));
System.out.println(sete.add(duplicate));
Output:
true
false
true
false
true
Run Code Online (Sandbox Code Playgroud)
编辑:好的,现在我添加了一个hashCode方法,适用于定向边.有人可以帮我计算无向边的哈希吗?
public class Edge {
private Node first, second;
@Override
public /boolean equals(Object ob) {
if (ob instanceof Edge) {
Edge edge = (Edge) ob;
if (first.equals(edge.first)
&& second.equals(edge.second)
|| first.equals(edge.second)
&& second.equals(edge.first))
return true;
}
return false;
}
@Override
public int hashCode() {
int …Run Code Online (Sandbox Code Playgroud) 我在这里尝试了一点。但是我不明白为什么 TreeSet 可以在这里过滤掉重复的条目,而 HashSet 不能。
public class DataClass implements Comparable<DataClass> {
private final String data;
public DataClass(String data) {
this.data = data;
}
@Override
public boolean equals(Object other) {
if (other == null || other.getClass() != this.getClass()) return false;
DataClass dc = (DataClass) other;
return this.data.length() == dc.data.length();
}
@Override
public int compareTo(DataClass dc) {
return Integer.compare(this.data.length(), dc.data.length());
}
@Override
public String toString() {
return data;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的主要方法:
DataClass[] data = new DataClass[4];
data[0] = new DataClass("Hans");
data[1] = …Run Code Online (Sandbox Code Playgroud)