如何从Java Map获取元素位置

时间:2013-11-27 10:51:47

标签: java

我有这张Java Map:

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

private static final Map<String, Users> cache = new HashMap<>();
这可能吗?或者我必须使用另一个Java集合?

13 个答案:

答案 0 :(得分:23)

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

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

class MyLinkedMap<K, V> extends LinkedHashMap<K, V>
{

    public V getValue(int i)
    {

       Map.Entry<K, V>entry = this.getEntry(i);
       if(entry == null) return null;

       return entry.getValue();
    }

    public Map.Entry<K, V> getEntry(int i)
    {
        // check if negetive index provided
        Set<Map.Entry<K,V>>entries = entrySet();
        int j = 0;

        for(Map.Entry<K, V>entry : entries)
            if(j++ == i)return entry;

        return null;

    }

}

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

MyLinkedMap<String, Integer>map = 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

答案 1 :(得分:8)

HashMap不接受订单。如果您担心订单,请使用LinkedHashMap

Map<String, Users> orderedMap=new LinkedHashMap<>();

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

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

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

实施例

 Map<String, String> 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)
    }

答案 2 :(得分:6)

使用番石榴Iterables

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:5)

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

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

答案 5 :(得分:3)

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

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

更新:

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

LinkedHashMap<String,User> linkedHashMap = new LinkedHashMap<String,User>();
// or LinkedHashMap<String,User> 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<User>(linkedHashMap.values())).get(pos);
System.out.println(tmp.getName());

答案 6 :(得分:2)

HashMaps 不保留订购:

LinkedHashMap ,可确保可预测的迭代顺序。

示例

public class Users 
{
 private String Id;

 public String getId()
 {
    return Id;
 }

 public void setId(String id) 
 {
    Id = id;
 }
}


Users user;
LinkedHashMap<String,Users> linkedHashMap = new LinkedHashMap<String,Users>();

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<Users>(linkedHashMap.values())).get(pos);
System.out.println(value.getId());

答案 7 :(得分:1)

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

答案 8 :(得分:1)

HashMap中没有订单。您可以使用map.keySet()获取可能密钥列表,但不能保证密钥集符合您添加的顺序。使用LinkedHashMap代替HashMap它将始终返回密钥以相同的顺序(插入)

答案 9 :(得分:1)

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

答案 10 :(得分:1)

如果排序意味着重要意义,您可以考虑使用SortedMap

具体实施:TreeMap

答案 11 :(得分:1)

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

答案 12 :(得分:1)

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

有关LinkedHashMap的详细信息,请参阅this

例如,从特定索引

获取元素

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

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