web-dev-qa-db-ja.com

特定のインデックスでTreeMapのキーと値を取得する方法

「キーと値」のペアのセットを持つTreeMapがあります。 TreeMapの特定のインデックスでキーと値の両方を取得するにはどうすればよいですか?

編集:@ TO-ALL:ありがとう。しかし、追加のArrayListを使用して実装する方法を知っています。余分なArrayListを使用せずにこれを達成する方法があると思いました。

17
Dileep Perla

本当にTreeMapを使用して位置ごとに取得する場合は、次を使用できます。

key => treemap.keySet().toArray()[0]
value => treemap.get(key); 

または(値だけが必要な場合)

treemap.values().toArray()[0]; 

ただし、上記の方法のように、イテレータを使用することをお勧めします。検索するたびに配列を作成する必要があるため(それほど効率的ではありません)、インデックスが届かないように十分注意する必要があります。

23
Chandra

まず、ここにいる人々が質問の妥当性について頻繁に関心を持っている理由がわかりません。 ArrayListをソートされた順序で維持するのに適していると見られる事例は数多くあります。 ArrayListをソートされた順序で維持することは、大きなリストに対しては非常に非効率的です。

標準のJava(Oracle)ソース配布のエントリノードは、子孫ツリーのサイズを維持しません。このため、インデックスなしでマップ内の要素を識別することはできません非効率的な順次検索。

この欠点は非常に深刻であるため、インデックスによって要素を効率的に取得してindexOf(E)を計算できる独自のAVLマップを作成しました。これを可能にするには、エントリの左右の各ブランチのサイズを維持するだけです。 Glazedlistsライブラリには、検索可能なツリーがどこかに埋め込まれている可能性があります。あなたはそれをレビューしたいと思うかもしれません。

7
Booyah Johnson

配列リストのエントリセットをコピーし、インデックスで目的のエントリを取得できます。

list=new ArrayList<Map.Entry<K,V>>(treeMap.entrySet());
Map.Entry<K,V>=list.get(index);

ただし、a)コピーにはO(N)時間かかります。b)treeMapが変更されると、リストは無効になります。

4

これは最善の方法ではないかもしれませんが、特定のインデックスでキー/値にアクセスできます。

TreeMap<Object, Object> foo = new TreeMap<Object, Object>();
Object key = foo.keySet().toArray(new Object[foo.size()])[YOUR_INDEX];
Object value = foo.get(key);

これは役に立つかもしれません

TreeMap< String,Integer > ht=new TreeMap<>();

ht.put("12",1);
ht.put("22",2);
ht.put("32",3);
ht.put("42",4);
for(int i=0;i<ht.size();i++)
{
   System.out.println(new Vector(ht.keySet()).get(i));
   System.out.println(new Vector(ht.values()).get(i));
}
0
Vineet Agarwal