繁体   English   中英

如何从Java中的HashMap获取关键位置

[英]How to get key position from a HashMap in Java

如何获得地图上的关键位置? 我如何看待“奥迪”和“宝马”在哪个位置?

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("Audi", 3);
map.put("BMW", 5);

如其他答案所述,您需要使用类似java.util.LinkedHashMap的结构。 LinkedHashMap使用LinkedEntrySet内部维护其密钥,这不会正式提供顺序,而是按照所使用的插入顺序进行迭代。

如果将Map.keySet()传递到List实现中,则可以使用List.indexOf(Object)方法,而不必在其他答案中编写任何额外的代码。

Map<String, Integer> map = new LinkedHashMap<String, Integer>();
map.put("Audi", 3);
map.put("BMW", 5);
map.put("Vauxhall", 7);

List<String> indexes = new ArrayList<String>(map.keySet()); // <== Set to List

// BOOM !

System.out.println(indexes.indexOf("Audi"));     // ==> 0
System.out.println(indexes.indexOf("BMW"));      // ==> 1
System.out.println(indexes.indexOf("Vauxhall")); // ==> 2

你不能 HashMap JavaDocs中

基于哈希表的Map接口的实现。 此实现提供所有可选的映射操作,并允许空值和空键。 (HashMap类与Hashtable大致等效,不同之处在于它是不同步的,并且允许为null。)该类不保证映射的顺序。 特别是,它不能保证顺序会随着时间的推移保持恒定。

因此,顺序可能在迭代之间有所不同。 如果您需要保留订单,可以查看LinkedHashMap

LinkedHashMap JavaDocs中

Map接口的哈希表和链表实现,具有可预测的迭代顺序。 此实现与HashMap的不同之处在于,它维护贯穿其所有条目的双向链接列表。 此链表定义了迭代顺序,通常是将键插入映射的顺序(插入顺序)。

因此,要找到键位置,基本上需要迭代键并计算要搜索的键的位置。

另外,IMO可能不是Map数据类型的最佳用法。 我相信,如果您确实需要该职位,则应使用某种类型的List (例如ArrayList ),它实际上会保留顺序,并且可以使用get方法来检索特定索引的元素。

你不能 Map和HashMap上的键没有排序。 您需要使用保留顺序的结构,例如LinkedHashMap

请注意,LinkedHashMap不提供按位置获取键的方法,因此仅在要使用迭代器的情况下才适用。

另一种方法是创建第二个Map,该Map从您的键映射到Integer位置,并随着您的操作添加到其中:

Map<String, Integer> indexMap = new HashMap<String, Integer>();
indexMap.put("Audi", 0);
indexMap.put("BMW", 1);

对于更优雅的解决方案,您可能需要提供有关您正在做的事情的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM