import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.swing.JFrame;
public class Test extends JFrame {
public static void main(String[] args) {
SortedSet<MarkNode> ss = new TreeSet<MarkNode>();
MarkNode mn1 = new MarkNode();
mn1.m_strID = "111";
ss.add(mn1);
MarkNode mn2 = new MarkNode();
mn2.m_strID = "2";
ss.add(mn2);
MarkNode mn3 = new MarkNode();
mn3.m_strID = "3";
ss.add(mn3);
MarkNode mn4 = new MarkNode();
mn4.m_strID = "111";
ss.add(mn4);
MarkNode mn5 = new MarkNode();
mn5.m_strID = "2";
ss.add(mn5);
Iterator<MarkNode> it = ss.iterator();
System.out.println("The elements in the TreeSet:");
while(it.hasNext())
System.out.print(it.next().m_strID + " ");
System.out.println();
if(mn1.equals(mn4))
System.out.println("mn1 equals mn4");
System.out.println("does mn1 and mn4's hashcode equal: " + (mn1.hashCode() == mn4.hashCode()));
System.out.println("mn1 compared to mn4: " + mn1.compareTo(mn4));
}
}
class MarkNode implements Comparable<MarkNode> {
public String m_strID;
public double m_dDist;
public int m_iRank;
public int compareTo(MarkNode arg0) {
System.out.println("this = " + this.m_strID + " compare = " + arg0.m_strID);
if(!m_strID.equals(arg0.m_strID)) {
return 1;
}
return 0;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((m_strID == null) ? 0 : m_strID.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if(m_strID.equals(((MarkNode)obj).m_strID))
return true;
return false;
}
}
结果:
this = 2 compare = 111
this = 3 compare = 111
this = 3 compare = 2
this = 111 compare = 2
this = 111 compare = 3
this = 2 compare = 2
The elements in the TreeSet:
111 2 3 111
mn1 equals mn4
does mn1 and mn4's hashcode equal: true
this = 111 compare = 111
mn1 compared to mn4: 0
看此句:
this = 111 compare = 111
出现在TreeSet所含元素打印结果之后,不知道什么原因,应该和111没有去重有关
初步原因找到:
看出来一些问题,在equals和hashCode都满足要求之后,无法去重是因为compareTo的实现关系,实现中compareTo只返回字符串 比较大于或者等于的结果,这样会影响到内部TreeMap的元素比较判断,因为大于,只会往右子树方向比较,会忽略左子树元素,原本相重的元素没有比较到 也就没有去重,这些看TreeMap中public V put(K key, V value)方法实现可以看出
public int compareTo(MarkNode marknode) {
System.out.println("this = " + this.m_strID + " compare with " + marknode.m_strID);
return this.m_strID.compareTo(marknode.m_strID);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((m_strID == null) ? 0 : m_strID.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if(m_strID.equals(((MarkNode)obj).m_strID))
return true;
return false;
}
compareTo正确实现之后貌似又不需要重写equlas和hashCode也能去重了
关于TreeMap中put方法研究:
http://dracularking.iteye.com/blog/691706