java 认识TreeMap有序集合

本文介绍了Java中的TreeMap,它是一个根据键进行排序的Map集合,基于红黑树实现。TreeMap支持自然顺序或自定义比较器进行排序,并提供了获取最小值、最大值、成功继任者、前驱节点等操作。同时,文章讨论了插入和删除节点时维持红黑树平衡的方法,以及各种导航方法如ceilingEntry、descendingMap等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        TreeMap是一个能比较元素大小的Map集合,会对传入的key进行了大小排序。可以使用元素的自然顺序,也可以使用集合中自定义的比较器来进行排序。

        TreeMap底层实现了树形结构,实现了红黑树的一个结构。TreeMap继承于AbstractMap,实现了Map, Cloneable, NavigableMap, Serializable接口。

获得最小与最大:

由于他的底层原理是一个红黑树,所以最小与最大实际上,就是取最左与最右。

 

successor方法/predecessor方法:

successor方法用来查找该节点的后续结点。predecessor方法用来查找前驱节点。

详细见转载博客:TreeMap方法successor/predecessor图解_dengjili的专栏-优快云博客

 树的左旋与右旋方法:

fixAfterInsertion方法:

 每次插入节点后都会默认调用的位置红黑树平衡的一个方法

/** From CLR */
    private void fixAfterInsertion(Entry<K,V> x) {
        x.color = RED;

        while (x != null && x != root && x.parent.color == RED) {
            if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
                Entry<K,V> y = rightOf(parentOf(parentOf(x)));
                if (colorOf(y) == RED) {
                    setColor(parentOf(x), BLACK);
                    setColor(y, BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    x = parentOf(parentOf(x));
                } else {
                    if (x == rightOf(parentOf(x))) {
                        x = parentOf(x);
                        rotateLeft(x);
                    }
                    setColor(parentOf(x), BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    rotateRight(parentOf(parentOf(x)));
                }
            } else {
                Entry<K,V> y = leftOf(parentOf(parentOf(x)));
                if (colorOf(y) == RED) {
                    setColor(parentOf(x), BLACK);
                    setColor(y, BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    x = parentOf(parentOf(x));
                } else {
                    if (x == leftOf(parentOf(x))) {
                        x = parentOf(x);
                        rotateRight(x);
                    }
                    setColor(parentOf(x), BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    rotateLeft(parentOf(parentOf(x)));
                }
            }
        }
        root.color = BLACK;
    }

与之对应的fixAfterDeletion方法

是在删除结点时调用的,维持红黑树平衡的方法。

/** From CLR */
    private void fixAfterDeletion(Entry<K,V> x) {
        while (x != root && colorOf(x) == BLACK) {
            if (x == leftOf(parentOf(x))) {
                Entry<K,V> sib = rightOf(parentOf(x));

                if (colorOf(sib) == RED) {
                    setColor(sib, BLACK);
                    setColor(parentOf(x), RED);
                    rotateLeft(parentOf(x));
                    sib = rightOf(parentOf(x));
                }

                if (colorOf(leftOf(sib))  == BLACK &&
                    colorOf(rightOf(sib)) == BLACK) {
                    setColor(sib, RED);
                    x = parentOf(x);
                } else {
                    if (colorOf(rightOf(sib)) == BLACK) {
                        setColor(leftOf(sib), BLACK);
                        setColor(sib, RED);
                        rotateRight(sib);
                        sib = rightOf(parentOf(x));
                    }
                    setColor(sib, colorOf(parentOf(x)));
                    setColor(parentOf(x), BLACK);
                    setColor(rightOf(sib), BLACK);
                    rotateLeft(parentOf(x));
                    x = root;
                }
            } else { // symmetric
                Entry<K,V> sib = leftOf(parentOf(x));

                if (colorOf(sib) == RED) {
                    setColor(sib, BLACK);
                    setColor(parentOf(x), RED);
                    rotateRight(parentOf(x));
                    sib = leftOf(parentOf(x));
                }

                if (colorOf(rightOf(sib)) == BLACK &&
                    colorOf(leftOf(sib)) == BLACK) {
                    setColor(sib, RED);
                    x = parentOf(x);
                } else {
                    if (colorOf(leftOf(sib)) == BLACK) {
                        setColor(rightOf(sib), BLACK);
                        setColor(sib, RED);
                        rotateLeft(sib);
                        sib = leftOf(parentOf(x));
                    }
                    setColor(sib, colorOf(parentOf(x)));
                    setColor(parentOf(x), BLACK);
                    setColor(leftOf(sib), BLACK);
                    rotateRight(parentOf(x));
                    x = root;
                }
            }
        }

        setColor(x, BLACK);
    }

 常用方法:

public Map.Entry ceilingEntry(K key)

返回指定的Key大于或等于的最小值的元素,如果没有,则返回null

 

public K ceilingKey(K key)

返回指定的Key大于或等于的最小值的Key,如果没有,则返回null

 

public Comparator super K> comparator()

如果使用默认的比较器,就返回null,如果使用其他的比较器,则返回比较器的哈希码值

public NavigableSet descendingKeySet()

返回集合的全部Key,并且是逆序的

public NavigableMap descendingMap()

把集合逆序返回

public Map.Entry firstEntry()

返回集合中最小Key的元素

public K firstKey()

返回集合中最小Key的key

public Map.Entry floorEntry(K key)

与ceilingEntry()方法相反,是返回小于等于key的最大Key的元素

public K floorKey(K key)

返回小于等于key的最大Key的key

public SortedMap headMap(K toKey)

返回Key小于toKey的所有元素

public NavigableMap headMap(K toKey, boolean inclusive)

当inclusive为true时,就是返回Key小于等于toKey的所有元素

public Map.Entry higherEntry(K key)

返回Key大于key的所有元素

public K higherKey(K key)

返回Key大于key的所有Key

public Map.Entry lastEntry()

返回Key最大的元素

public K lastKey()

返回Key最大的Key

public Map.Entry lowerEntry(K key)

返回小于key的最大元素

public K lowerKey(K key)

返回小于key最大的Key

public Map.Entry pollFirstEntry()

删除key最小的元素

public Map.Entry pollLastEntry()

删除最大Key的元素

public NavigableMap subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)

截取集合中Key从fromKey到toKey的元素,false则是会截取他们本身

public NavigableMap tailMap(K fromKey, boolean inclusive)

当inclusive为true时,截取Key大于等于fromKey的所有元素,否则截取Key大于fromKey的所有元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值