是否可以访问Map<Integer, Integer>
通过索引?
我需要获取地图的第二个元素。
您使用了错误的数据结构。如果您需要按键查找,请使用Map
. 如果您需要按索引或插入顺序查找,请使用可以让您索引的东西,例如数组或列表或链表。
如果您需要同时查找,那么您需要创建一个复合数据结构来跟踪键和插入顺序(实现将由Map
上述数据结构之一支持)。
框架中甚至还内置了一个:LinkedHashMap
.
没有直接的方法可以“通过索引”访问地图,但看起来您需要 a LinkedHashMap
,它提供了可预测的迭代顺序:
...这通常是键插入地图的顺序(插入顺序)。请注意,如果将键重新插入到地图中,则插入顺序不会受到影响。(如果调用 when将在调用之前立即返回,则将键
k
重新插入到映射中。)m
m.put(k, v)
m.containsKey(k)
true
不确定这是否是任何“更清洁”,但是:如果使用 LinkedHashMap 并且您想检索插入的元素,则第二个以下将起作用
List keys = new ArrayList(map.keySet());
Object obj = map.get(keys.get(1));
//do you staff here
您还可以使用 apache commons-collection 中的 org.apache.commons.collections.map.ListOrderedMap。它实现 Map 并提供 List 接口的一些方法,如 get(int index) 和 remove(int index)。
它在内部使用 ArrayList,因此性能将优于在 Map 上迭代以检索指定位置的值。
这将取决于 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);
如果您只需要一直获取第二个元素。为什么不使用迭代器,然后执行下一个,下一个。
Map 不按插入顺序存储元素。它根据正在存储的元素的hashCode值将元素存储到存储桶中。所以不,你不能通过索引得到它。
无论如何,您可以通过使用接口的LinkedHashMap实现来模仿这样的事情,该Map
接口记住插入顺序(取消链接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"
这就是你想要的。
index 的定义不适用于Map
,因为默认情况下它不是有序集合。
您可以使用 a TreeMap
,它实现NavigableMap
,然后使用该navigableKeySet()
方法迭代密钥集。