`

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

 

 

 

分享到:
评论

相关推荐

    set集合的基本特点,set集合底层去重原理,集合怎么进行排序

    总之,Set集合提供了存储不重复元素的能力,HashSet利用散列技术高效地去重,而SortedSet如TreeSet则可以对元素进行排序。理解和熟练掌握这些概念对于编写高效的Java代码至关重要。在实际编程中,根据需求选择合适的...

    Unity数据结构与内存优化

    SortedSet是可排序的集合,元素按特定顺序排列,增删快,但相比于HashSet,它在内存占用上更高,数据量大时效率可能会降低。 Hashtable是键值对(key-value)存储的老式数据结构,无序且动态扩展,基于数组实现,...

    redis命令参考手册

    - 使用合适的数据结构:根据实际需求选择最适合的数据类型,例如用Set代替List进行成员去重。 - 使用LRU(Least Recently Used)策略:当内存不足时,根据最近使用情况淘汰数据。 - 缓存穿透、缓存雪崩和缓存击穿...

    JAVA集合类用法总结

    TreeSet实现了SortedSet接口,提供了按自然顺序或自定义比较器排序的Set,它基于红黑树数据结构实现。 Map接口则不同于Collection,它存储的是键值对,每个键是唯一的。HashMap是最常用的Map实现,它通过哈希表快速...

    JavaSE.docx

    **Set&&TreeSet**:Set接口不允许重复元素,而TreeSet实现了SortedSet接口,元素按自然排序或自定义比较器排序。 **HashSet**:Set接口的实现,不保证元素顺序,但去重效果好,性能高。 **Map接口**:键值对存储,...

    SCJP 310-055 题库7

    不过,可以推测可能会涉及`HashSet`的行为、元素的去重以及元素的添加顺序等问题。 通过以上解析,我们可以了解到SCJP 310-055题库Module7中的几个关键知识点,包括`HashMap`、`HashSet`、`LinkedList`、`TreeSet`...

    Redis高并发问题的解决方法

    - 根据业务需求选择合适的数据结构,例如,使用Set代替List处理去重,使用SortedSet进行范围查询,或者使用Hashes进行复杂对象的存储,都能优化性能。 7. **预加载与缓存策略**: - 对于热点数据,可以考虑预先...

    Java-Collections-Finishing-Off-Sets-Source-code:Udemy挑战,套装-Source code collection

    2. **TreeSet**: 它实现了SortedSet接口,内部基于红黑树数据结构。TreeSet保证了元素的排序,无论是自然排序还是定制排序。 3. **LinkedHashSet**: 这种Set实现保留了元素的插入顺序,它同时使用哈希表和双向链表...

Global site tag (gtag.js) - Google Analytics