2012-11-27 41 views
30

如何根据索引从LinkedHashMap获取值而不是键?

LinkedHashMap<String, List<String>> hMap; 

我想位置没有键搞定List<String>

我不想使用迭代。

是否有任何其他方式获得基于索引的价值?

+2

如果你自己选择这个数据结构,那么它可能不是这个任务的最佳选择。 –

+0

@尼古拉·库兹涅佐夫:你能告诉我结构应该如何吗? – MAC

+0

ArrayList 如果您仅通过索引提取元素 –

回答

41

你不能得到Map的基于索引值,Map的只有我不工作的方式。解决方法是从您的值中创建一个新列表并获取基于索引的值。

LinkedHashMap<String, List<String>> hMap; 
List<List<String>> l = new ArrayList<List<String>>(hMap.values()); 
l.get(0); 
+2

如果我想插入基于索引的价值?如何实现这一目标? –

+1

这里是我发布到这个无论如何,我不能发布在这里,这个线程被锁定的答案:http://stackoverflow.com/a/31749969/961018 – momomo

13
public List<String> getByIndex(LinkedHashMap<String, List<String>> hMap, int index){ 
    return (List<String>) hMap.values().toArray()[index]; 
} 
9

你可能想要考虑使用另一个类来存储你的数据,或者写一个扩展到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

标准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

5

正如凯文鲍尔索克斯说,它是那样简单

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

但要注意的是,这仍然会通过迭代.toArray()。这是一个简单的陈述,我不确定是否有更好的性能,但要注意复杂性不是log(n)(如B *情况下的索引访问),但只是n。 由于LinkedHashMap基于LinkedList,因此无法随机访问元素,只能按顺序进行。

由于.toArray()遵循返回Object而不是通用数据类型的古老概念,所以转换为List是不可避免的邪恶。

虽然这可能不是地图的主要概念,但LinkedHashMap不仅仅是一张地图。它扩展了HashMap,并且作为扩展类,带来支持该类特性的其他方法是完全正确的。

+0

创建一个新的数组..不是很漂亮 – momomo

+1

这里是我发布到这个无论如何,我不能张贴在这里,这个线程被锁定的答案:http://stackoverflow.com/a/31749969/961018 – momomo

+0

@momo我的帖子只是为了解释Kevin Bowersox提出的建议并不是避免迭代,而且也没有这种方式。通过手动迭代值可以很容易地避免创建数组,但当问题是如何不迭代时,这不是理想的答案。显然你可以通过用不同的索引概念创建你自己的实现来避免这种情况,但这与问题似乎无关。 – makrom

相关问题