19

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

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

4

6 に答える 6

26

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

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

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

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

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

于 2012-06-22T13:30:51.477 に答える
8

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

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

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

于 2013-10-24T17:08:38.560 に答える
6

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

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

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

于 2012-06-22T13:33:01.760 に答える
2

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

TreeMap<Object, Object> foo = new TreeMap<Object, Object>();
Object key = foo.keySet().toArray(new Object[foo.size()])[YOUR_INDEX];
Object value = foo.get(key);
于 2012-06-22T13:30:17.853 に答える
1

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

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));
}
于 2017-02-25T13:47:27.553 に答える
-2

値からキーを取得する別のオプションを次に示します。

Map<String, String> map = new HashMap<String, String>();
map.put("s1", "s1Val");
map.put("s2", "s2Val");
map.put("s3", "s3Val");

    // ex: "s2Val" -> return "s2"

int index = new ArrayList<String>(map.values()).indexOf("s2Val");
System.out.println(map.keySet().toArray()[index]); // -> return "s2"
于 2014-03-06T16:38:57.650 に答える