我有这张Java Map:
你能告诉我如何获得地图的第6个元素吗?
private static final Map<String, Users> cache = new HashMap<>();
这可能吗?或者我必须使用另一个Java集合?
答案 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
没有职位。您可以遍历其KeySet
或EntrySet
,并选择第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);