如何从Java Map获取元素位置

我有这个Java Map:

你能告诉我如何获得地图的第6个元素吗?

private static final Map cache = new HashMap(); 

这可能吗? 或者我必须使用另一个Java集合?

虽然回答有点迟。 但是选项是使用LinkedHashMap :这个地图根据元素的插入来保留顺序,正如大家所建议的那样。 但是,作为警告,它有一个构造函数LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) ,它将创建一个链接的哈希映射,其迭代顺序是其条目最后一次accessed的顺序。 在这种情况下不要使用此构造函数。

但是,如果我需要这样的function,我会扩展它并实现我的必要function,以OOP方式重用它们。

 class MyLinkedMap extends LinkedHashMap { public V getValue(int i) { Map.Entryentry = this.getEntry(i); if(entry == null) return null; return entry.getValue(); } public Map.Entry getEntry(int i) { // check if negetive index provided Set>entries = entrySet(); int j = 0; for(Map.Entryentry : entries) if(j++ == i)return entry; return null; } } 

现在我可以实例化它,并且可以以我想要的方式获得条目和值:

 MyLinkedMapmap = new MyLinkedMap<>(); map.put("a first", 1); map.put("a second", 2); map.put("a third", 3); System.out.println(map.getValue(2)); System.out.println(map.getEntry(1)); 

输出:

 3 a second=2 

HashMap不会授予订单。 如果您关心订单,则应使用LinkedHashMap

 Map orderedMap=new LinkedHashMap<>(); 

现在,当你放置一个元素时,它会保持你所放置的顺序。

如果你想得到第6个元素,现在你可以这样做,因为你的元素按顺序排列。

  orderedMap.values().toArray()[5]// will give you 6th value in the map. 

  Map orderedMap=new LinkedHashMap<>(); orderedMap.put("a","a"); orderedMap.put("b","b"); System.out.println(orderedMap.values().toArray()[1]); // you will get b(value) System.out.println(orderedMap.keySet().toArray()[1]); // you will get b(key) } 

与番石榴的Iterables

 Iterables.get(map.entrySet(),6); 

HashMap不保持插入其中的元素的顺序。 您可以使用LinkedHashMap来维护插入其中的元素的顺序。

虽然您需要注意,即使LinkedHashMap也没有这样的方法可以在特定索引处提供元素。 您必须手动迭代条目并在第6次迭代时提取元素。

HashMap没有明确的键排序。它是无序的。

您可以使用LinkedHashMap ,它将按插入顺序存储您的密钥。您可以通过调用keySet()来检索它们。

根据文档 ,HashMap是基于Hash表的Map接口实现。 此实现提供所有可选的映射操作,并允许空值和空键。 (HashMap类大致相当于Hashtable,除了它是不同步的并且允许空值。) 这个类不保证地图的顺序; 特别是,它不保证订单会随着时间的推移保持不变。

这就是使用这种collections品并不明智的原因。

更新:

基于@Prateek实现LinkedHashMap,我建议如下:

 LinkedHashMap linkedHashMap = new LinkedHashMap(); // or LinkedHashMap linkedHashMap = new LinkedHashMap<>(); //for java 7+ linkedHashMap.put("1",userObj1); linkedHashMap.put("2",userObj2); linkedHashMap.put("3",userObj3); /* Get by position */ int pos = 1; // Your position User tmp= (new ArrayList(linkedHashMap.values())).get(pos); System.out.println(tmp.getName()); 

HashMaps不保留排序:

LinkedHashMap保证可预测的迭代顺序。

 public class Users { private String Id; public String getId() { return Id; } public void setId(String id) { Id = id; } } Users user; LinkedHashMap linkedHashMap = new LinkedHashMap(); for (int i = 0; i < 3; i++) { user = new Users(); user.setId("value"+i); linkedHashMap.put("key"+i,user); } /* Get by position */ int pos = 1; Users value = (new ArrayList(linkedHashMap.values())).get(pos); System.out.println(value.getId()); 

正确!! 你将不得不使用其他集合来获取索引(位置)的值。 您可以使用ArrayList

HashMap没有位置。 您可以遍历其KeySetEntrySet ,并选择第n个元素,但它与位置并不完全相同。 LinkedHashMap确实有一个位置,因为它具有可预测的迭代顺序。

如果排序意味着任何重要的事情,您可以考虑使用SortedMap 。

具体实现: TreeMap

您需要使用LinkedHashMap才能告诉插入元素的顺序。 HashMap无法这样做。

HashMap没有Order。 您可以使用map.keySet()获取may键列表,但不能保证键集将按照您添加它的顺序。使用LinkedHashMap而不是HashMap它将始终以相同的顺序返回键(如插入)

使用LinkedHashMap而不是HashMap它将在调用keySet()时以相同的顺序(作为插入)返回键。

有关LinkedHashMap的详细信息,请参阅此内容

例如,从特定索引获取元素

根据您的值创建一个新列表,并根据索引获取值。

  LinkedHashMap> hMap; List> l = new ArrayList>(hMap.values()); l.get(6);