是否有可能通过它的位置从HashMap中获取元素?
如何从HashMap的位置检索一个元素,有没有可能?
HashMaps不保留sorting:
这个class级不能保证地图的顺序。 特别是不能保证订单会随着时间的推移而保持不变。
看看LinkedHashMap ,它保证了可预测的迭代顺序。
使用LinkedHashMap,当需要按位置检索时,将值转换为ArrayList。
LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<String,String>(); /* Populate */ linkedHashMap.put("key0","value0"); linkedHashMap.put("key1","value1"); linkedHashMap.put("key2","value2"); /* Get by position */ int pos = 1; String value = (new ArrayList<String>(linkedHashMap.values())).get(pos);
如果要维护将元素添加到地图的顺序,请使用LinkedHashMap
而不是HashMap
。
这里有一个方法可以让你通过它在地图上的索引获得一个值:
public Object getElementByIndex(LinkedHashMap map,int index){ return map.get( (map.keySet().toArray())[ index ] ); }
是。 使用LinkedHashMap 。
使用LinkedHashMap并使用这个函数。
private LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>();
像这样定义和。
private Entry getEntry(int id){ Iterator iterator = map.entrySet().iterator(); int n = 0; while(iterator.hasNext()){ Entry entry = (Entry) iterator.next(); if(n == id){ return entry; } n ++; } return null; }
该function可以返回所选的条目。
如果你出于某种原因不得不坚持使用hashMap,你可以将keySet转换为一个数组,并索引数组中的键,以获得地图中的值,如下所示:
Object[] keys = map.keySet().toArray;
然后你可以像这样访问地图:
map.get(arr[i]);
HashMap – 和底层的数据结构 – 哈希表,没有位置的概念。 与LinkedList或Vector不同,input键被转换为存储值的“存储区”。 这些桶不是按照在HashMap接口之外有意义的方式sorting的,因此,放入HashMap的项目不是按顺序排列的,因为您希望使用其他数据结构
HashMap没有位置的概念,所以没有办法按位置获取对象。 地图中的对象是通过键设置和获取的。
我通过“位置”来假设您指的是您将元素插入到HashMap中的顺序。 在这种情况下,你想要使用LinkedHashMap。 然而,LinkedHashMap不提供访问器方法。 你需要写一个像
public Object getElementAt(LinkedHashMap map, int index) { for (Map.Entry entry : map.entrySet()) { if (index-- == 0) { return entry.value(); } } return null; }
哈希映射不允许按位置访问,它只知道哈希码,并且如果它可以计算密钥的哈希码,则可以检索该值。 TreeMaps有一个sorting的概念。 Linkedhas地图保留了他们进入地图的顺序。
你可以尝试实现这样的事情,看看:
Map<String, Integer> map = new LinkedHashMap<String, Integer>(); map.put("juan", 2); map.put("pedro", 3); map.put("pablo", 5); map.put("iphoncio",9) List<String> indexes = new ArrayList<String>(map.keySet()); // <== Parse System.out.println(indexes.indexOf("juan")); // ==> 0 System.out.println(indexes.indexOf("iphoncio")); // ==> 3
我希望这对你有用。
另一个工作方法是将地图值转换为数组,然后在索引处检索元素。 通过使用以下方法在100 000个对象的LinkedHashMap中进行索引search来testing100 000个元素的运行导致了以下结果:
//My answer: public Particle getElementByIndex(LinkedHashMap<Point, Particle> map,int index){ return map.values().toArray(new Particle[map.values().size()])[index]; } //68 965 ms //Syd Lambert's answer: public Particle getElementByIndex(LinkedHashMap<Point, Particle> map,int index){ return map.get( (map.keySet().toArray())[ index ] ); } //80 700 ms
总而言之,从LinkedHashMap索引检索元素似乎是相当繁重的操作。