如何从Java Map获取元素位置

Pet*_*zov 15 java

我有这个Java Map:

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

private static final Map<String, Users> cache = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

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

Sag*_*age 26

虽然回答有点迟.但是选项是使用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;

    }

}
Run Code Online (Sandbox Code Playgroud)

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

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)); 
Run Code Online (Sandbox Code Playgroud)

输出:

3
a second=2
Run Code Online (Sandbox Code Playgroud)


Ruc*_*era 10

HashMap不接受订单.如果你担心订单,你应该使用LinkedHashMap

Map<String, Users> orderedMap=new LinkedHashMap<>();
Run Code Online (Sandbox Code Playgroud)

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

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

 orderedMap.values().toArray()[5]// will give you 6th value in the map. 
Run Code Online (Sandbox Code Playgroud)

 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)
    }
Run Code Online (Sandbox Code Playgroud)


kut*_*kem 6

与番石榴的Iterables

Iterables.get(map.entrySet(),6);
Run Code Online (Sandbox Code Playgroud)


Vig*_*ino 5

HashMap没有定义的keys.It的无序的顺序.

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


Sud*_*hul 5

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

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