これは私にはあまり意味がありません。リーフに格納される要素は、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
ies の 1 つを取得できる場合は、親をルートまでトラバースし、ツリーを任意の方法でトラバースして葉 ( Entry
whereleft == null
およびright == null
) を取得できます。インオーダートラバーサルは、ソートされた順序を保持します。
しかし、繰り返しますが、これを行う正当な理由は見当たりません。また、それらのiesjava.util
を調査できるようにするには、パッケージでそれを行う必要があります。Entry
しかし、ここにコードがあります。(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));
}
}