web-dev-qa-db-ja.com

キーではなくインデックスに基づいてLinkedHashMapから値を取得する方法

私は持っています

LinkedHashMap<String, List<String>> hMap;

私は手に入れたい List<String> by positionキーではありません。

繰り返しを使いたくありません。

インデックスに基づいて値を取得する他の方法はありますか?

43
MAC

インデックスに基づいてMapの値を取得することはできません。Mapsはそのままでは機能しません。回避策は、値から新しいリストを作成し、インデックスに基づいて値を取得することです。

LinkedHashMap<String, List<String>> hMap;
List<List<String>> l = new ArrayList<List<String>>(hMap.values());
l.get(0);
49
PermGenError
public List<String> getByIndex(LinkedHashMap<String, List<String>> hMap, int index){
   return (List<String>) hMap.values().toArray()[index];
}
15
Kevin Bowersox

別のクラスを使用してデータを保存するか、linkedHashMapに拡張機能を記述することを検討してください。何かのようなもの

//this is pseudo code
public class IndexedLinkedHashMap<K,V> extends LinkedHashMap{

HashMap<int,K> index;
int curr = 0;

    @Override
    public void add(K key,V val){
        super.add(key,val);
        index.add(curr++, key);
    }

    public V getindexed(int i){
        return super.get(index.get(i));
    }

}
12
schippi

Kevin Bowersoxが述べたように、それは次のように簡単です

List<String> result = (List<String>) hMap.values().toArray()[position];

ただし、これは.toArray()を使用して繰り返し処理されることに注意してください。それは単純なステートメントであり、パフォーマンスが優れているものがあるかどうかはわかりませんが、複雑さはlog(n)(B *の場合のインデックス付きアクセスのような)ではなく、nだけであることに注意してください。 LinkedHashMapはLinkedListに基づいているため、要素にランダムにアクセスする方法はなく、順番にのみです。

.toArray()は汎用データ型ではなくObjectを返すという古風な概念に従っているため、Listへのキャストは避けられない悪です。

これは地図の主要な概念ではないかもしれませんが、LinkedHashMapは単なる地図ではありません。 HashMapを拡張します。拡張クラスとして、そのクラスの特異性をサポートする追加のメソッドを追加してもまったく問題ありません。

7
makrom

直接のDSには、標準のJavaコレクションAPIにインデックス付きマップを提供するものはありません。ただし、次の結果が得られるはずです。

// An ordered map
Map<K, V> map = new LinkedHashMap<K, V>();
// To create indexed list, copy the references into an ArrayList (backed by an array)
List<Entry<K, V>> indexedList = new ArrayList<Map.Entry<K, V>>(map.entrySet());
// Get the i'th term
<Map.Entry<K,V>> entry = indexedList.get(index);
K key = entry.getKey();
V value = entry.getValue();

検索とは別に、マップ内のデータの永続性の懸念を保持したい場合があります。

更新:または、Apache Commonsの LinkedMap を使用します。

3
Neel