SortedSet去重

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

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值