是否可以通过索引访问Map<Integer, Integer>
?
我需要获取地图的第二个元素。
答案 0 :(得分:10)
您使用的是错误的数据结构。如果您需要按键查找,请使用Map
。如果需要按索引或插入顺序查找,请使用允许索引的内容,例如数组或列表或链接列表。
如果需要同时进行查找,则需要创建一个跟踪密钥和插入顺序的复合数据结构(实现将由Map
和上述数据结构之一支持。 / p>
框架中甚至还有一个:LinkedHashMap
。
答案 1 :(得分:2)
没有直接的方式来访问“通过索引”的地图,但看起来你想要一个LinkedHashMap
,它提供了一个可预测的迭代顺序:
...这通常是将键插入地图(插入顺序)的顺序。请注意,如果将键重新插入地图,则插入顺序不会受到影响。 (如果
k
在调用之前立即返回m
,则调用m.put(k, v)
时,会将一个键m.containsKey(k)
重新插入到地图true
中。)
答案 2 :(得分:0)
Map不会在插入顺序中存储元素。它根据正在存储的元素的 hashCode 的值将元素存储到存储桶中。所以不,你不能通过索引得到它。
无论如何,你可以使用Map
接口的 LinkedHashMap 实现来模仿这样的东西,它会记住插入顺序(取消 HashMap )。
您必须使用手动索引计数器“破解”,代码看起来像这样:
Map<String, String> map= new LinkedHashMap<>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");
int index= 0;
for (String key : map.keySet()) {
if (index++ == 1) {
System.out.println(map.get(key));
}
}
将打印:
"two"
这就是你想要的。
答案 3 :(得分:0)
索引的定义不适用于Map
,因为默认情况下它不是有序集合。
您可以使用实现TreeMap
的{{1}},然后使用NavigableMap
方法迭代密钥集。
答案 4 :(得分:0)
如果你只是需要一直得到第二个元素。为什么不使用迭代器,然后再做下一步。
答案 5 :(得分:0)
它将取决于Map实现,但如果要检索第二个插入元素,可以使用LinkedHashMap,然后在值上创建迭代器。
Map<Integer, Integer> map = new LinkedHashMap<Integer, Integer>();
map.put(1, 1);
map.put(2, 2);
Integer value = null;
if (map.size() > 1) {
Iterator<Integer> iterator = map.values().iterator();
for (int i = 0; i < 2; i++) {
value = iterator.next();
}
}
// value contains second element
System.out.println(value);
答案 6 :(得分:0)
您也可以使用apache commons-collection中的org.apache.commons.collections.map.ListOrderedMap。它实现了Map并从List接口提供了一些方法,比如get(int index)和remove(int index)。
它在内部使用ArrayList,因此性能优于迭代Map以检索指定位置的值。
答案 7 :(得分:0)
不确定这是否是“更干净”,但是: 如果使用LinkedHashMap并且你想要检索插入的第二个元素将会起作用
List keys = new ArrayList(map.keySet());
Object obj = map.get(keys.get(1));
//do you staff here