私は持っています
LinkedHashMap<String, List<String>> hMap;
キーではなくポジションList<String>
で取得したい。
iterateは使いたくない。
インデックスに基づいて値を取得する他の方法はありますか?
私は持っています
LinkedHashMap<String, List<String>> hMap;
キーではなくポジションList<String>
で取得したい。
iterateは使いたくない。
インデックスに基づいて値を取得する他の方法はありますか?
Map
インデックスに基づいての値を取得することはできませんMap
。そのようには機能しません。回避策は、値から新しいリストを作成し、インデックスに基づいて値を取得することです。
LinkedHashMap<String, List<String>> hMap;
List<List<String>> l = new ArrayList<List<String>>(hMap.values());
l.get(0);
public List<String> getByIndex(LinkedHashMap<String, List<String>> hMap, int index){
return (List<String>) hMap.values().toArray()[index];
}
別のクラスを使用してデータを格納するか、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));
}
}
Kevin Bowersoxが述べたように、それは
List<String> result = (List<String>) hMap.values().toArray()[position];
ただし、これは.toArray()を使用して繰り返されることに注意してください。これは単純なステートメントであり、パフォーマンスが優れているものがあるかどうかはわかりませんが、複雑さはlog(n)ではなく(B *の場合のインデックス付きアクセスのように)、nだけであることに注意してください。LinkedHashMapはLinkedListに基づいているため、要素にランダムにアクセスする方法はなく、順番にのみアクセスできます。
.toArray()は、ジェネリックデータ型ではなくObjectを返すという古風な概念に従っているため、Listへのキャストは避けられない悪です。
これはマップの主要な概念ではないかもしれませんが、LinkedHashMapは単なるマップではありません。これはHashMapを拡張し、拡張クラスとして、そのクラスの特異性をサポートする追加のメソッドを導入することはまったく問題ありません。
標準のJavaコレクションAPIには、インデックス付きマップを提供する直接DSはありません。ただし、次の方法で結果を得ることができます。
// 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();
それでも、取得とは別に、マップ内のデータの永続性に関する懸念を保持したい場合があります。
更新:または、 ApacheCommonsのLinkedMapを使用します。