黑马程序员技术交流社区

标题: TreeSet和TreeMap是怎么样实现排序的 [打印本页]

作者: 刘忠德    时间: 2012-1-1 15:42
标题: TreeSet和TreeMap是怎么样实现排序的
本帖最后由 刘忠德 于 2012-1-2 10:18 编辑

RT,TreeSet和TreeMap是怎么样实现排序的呢?
作者: 李爱霞    时间: 2012-1-1 15:45
TreeSet类内部使用了一个TreeMap对象。其中使用了二叉排序树的结构。

插入新节点的方法如下:
    public V put(K key, V value) {
        Entry<K,V> t = root;
        if (t == null) {  //如果不存在根节点则创建一个
            root = new Entry<K,V>(key, value, null);
            size = 1;
            modCount++;
            return null;
        }
        int cmp;
        Entry<K,V> parent;
        Comparator<? super K> cpr = comparator;
        if (cpr != null) {   //判断有没有比较器。
            do {                    //从根开始向下查找插入的位置(直到叶节点)
                parent = t;
                cmp = cpr.compare(key, t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }
        else {
            if (key == null)
                throw new NullPointerException();
            Comparable<? super K> k = (Comparable<? super K>) key;
            do {
                parent = t;
                cmp = k.compareTo(t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }
        Entry<K,V> e = new Entry<K,V>(key, value, parent);  //插入新节点。
        if (cmp < 0)
            parent.left = e;
        else
            parent.right = e;
        fixAfterInsertion(e);
        size++;
        modCount++;
        return null;
    }
作者: 颜宗茂    时间: 2012-1-1 16:20
注意的是它们不在使用哈希表,存储方式是一个特殊的二叉树,既然是有序的,自然要求元素是可以比较大小的,如果构造函数指定Comparator的话,就使用这个Comparator比较大小,如果没有指定Comparator的话,就使用自然排序(元素要实现Comparable接口).如果这两个都不可用,就会出错的.

作者: 詹英鹏    时间: 2012-1-1 17:10
哈希表HashMap,红黑树TreeMap,链表LinkedList,动态数组ArrayList等数据结构的迭代。

既然TreeMap是有序的,自然要求元素是可以比较大小的,如果构造函数指定Comparator的话,就使用这个Comparator比较大小,如果没有指定Comparator的话,就使用自然排序(元素要实现Comparable接口).如果这两个都不可用,就等着出错吧.
有关Java的排序:http://blog.csdn.net/treeroot/archive/2004/10/19/142636.aspx

因为是二叉树,所以一般查找时间复杂度为 o(lg(n)),这个效率当然没有HashMap的效率高.不过TreeMap比HashMap功能强大,如果不需要排序的话当然不会用TreeMap,如果需要排序的话,HashMap无法胜任,当然要用TreeMap了,它可以求子Map.所以这个是适用场合问题,无法比较他们.

另外,我们习惯了,有Map就会跟一个Set,我们都可以猜到TreeSet和通过TreeMap实现的一个SortedSet的实现.不过我觉的TreeSet好像比TreeMap用的场合多一些,求子集是很常用的呀!!

作者: 刘忠德    时间: 2012-1-2 10:17
谢谢楼上 的解答,了解了~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2