我有
LinkedHashMap<String, List<String>> hMap;
我想通过位置获取List<String>
而不是关键。
我不想使用迭代。
还有其他方法可以根据索引获取价值吗?
答案 0 :(得分:47)
您无法根据索引获取Map
的值,Map
只是不这样做。解决方法是根据您的值创建一个新列表,并根据索引获取值。
LinkedHashMap<String, List<String>> hMap;
List<List<String>> l = new ArrayList<List<String>>(hMap.values());
l.get(0);
答案 1 :(得分:13)
public List<String> getByIndex(LinkedHashMap<String, List<String>> hMap, int index){
return (List<String>) hMap.values().toArray()[index];
}
答案 2 :(得分:11)
你可能想要考虑使用另一个类来存储你的数据,或者写一个扩展到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));
}
}
答案 3 :(得分:6)
正如Kevin Bowersox所说,它就像
一样简单List<String> result = (List<String>) hMap.values().toArray()[position];
但应该注意的是,这仍将通过使用.toArray()进行迭代。这是一个简单的陈述,我不确定是否有更好的性能,但要注意复杂性不是log(n)(如B *情况下的索引访问),但只是n。 由于LinkedHashMap基于LinkedList,因此无法按顺序随机访问元素。
对List的强制转换是不可避免的恶,因为.toArray()遵循返回Object而不是通用数据类型的古老概念。
虽然这可能不是地图的主要概念,但LinkedHashMap不仅仅是一张地图。它扩展了HashMap,作为一个扩展类,可以使用其他方法来支持该类的特性。
答案 4 :(得分:3)
标准Java Collections 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();
您可能仍希望保留地图中数据持久性与检索分开的问题。
更新: 或者使用Apache Commons的LinkedMap。