这对我来说没有多大意义。存储在叶子上的元素取决于TreeMap的实现如何平衡树。
但是,假设您出于某种原因需要这样做。要真正做到这一点,您需要做一些攻击:编写一个打包在java.util
中的类,该类可以访问包的私有方法TreeMap
。
做一些更多的挖掘后,我发现,在JDK的默认树的实现是一个红黑树,其Entry
实现如下所示:
static final class Entry<K,V> implements Map.Entry<K,V> {
K key;
V value;
Entry<K,V> left = null;
Entry<K,V> right = null;
Entry<K,V> parent;
boolean color = BLACK;
....
似乎没有被任何直接的方式来获得根。但是,如果你可以抓住其中的一个,那么你可以一直遍历到父根,然后以任何你想得到树叶的方式(Entry
,其中left == null
和right == null
)做一个traversal of the tree。顺序遍历将保留排序顺序。
但是,重申一下,我没有看到有什么好的理由说明你想这样做。您还需要在java.util
包中执行此操作,以便能够调查那些Entry
ies。但是这里是代码,为了好玩。 (如果不覆盖JVM上的安全限制,您将无法执行此操作。)
package java.util;
import java.util.TreeMap.Entry;
public class TreeMapHax {
static <K,V> List<Entry<K, V>> getLeafEntries(TreeMap<K, V> map) {
Entry<K, V> root = map.getFirstEntry();
while(root.parent != null) root = root.parent;
List<Entry<K,V>> l = new LinkedList<Entry<K,V>>();
visitInOrderLeaves(root, l);
return l;
}
static <K,V> void visitInOrderLeaves(Entry<K, V> node, List<Entry<K, V>> accum) {
if(node.left != null) visitInOrderLeaves(node.left, accum);
if(node.left == null && node.right == null) accum.add(node);
if(node.right != null) visitInOrderLeaves(node.right, accum);
}
public static void main(String[] args) {
TreeMap<String, Integer> map = new TreeMap<String, Integer>();
for(int i = 0; i < 10; i++)
map.put(Integer.toString(i), i);
System.out.println(getLeafEntries(map));
}
}
这没有意义。存储在树叶上的元素取决于“TreeMap”的实现如何平衡树。您是否试图对执行的性能进行基准测试? – 2013-03-22 05:26:17
我知道该怎么做。在TreeMap中,所有叶子都是空的。所以你有他们。最底层的入口不是一片叶子。我想是这样。 – 2013-08-10 14:40:11