2

是否可以访问Map<Integer, Integer>通过索引?

我需要获取地图的第二个元素。

4

8 回答 8

9

您使用了错误的数据结构。如果您需要按键查找,请使用Map. 如果您需要按索引或插入顺序查找,请使用可以让您索引的东西,例如数组或列表或链表。

如果您需要同时查找,那么您需要创建一个复合数据结构来跟踪键和插入顺序(实现将由Map上述数据结构之一支持)。

框架中甚至还内置了一个:LinkedHashMap.

于 2013-06-13T13:30:23.230 回答
2

没有直接的方法可以“通过索引”访问地图,但看起来您需要 a LinkedHashMap,它提供了可预测的迭代顺序:

...这通常是键插入地图的顺序(插入顺序)。请注意,如果将键重新插入到地图中,则插入顺序不会受到影响。(如果调用 when将在调用之前立即返回,则将键k重新插入到映射中。)mm.put(k, v)m.containsKey(k)true

于 2013-06-13T13:31:22.030 回答
0

不确定这是否是任何“更清洁”,但是:如果使用 LinkedHashMap 并且您想检索插入的元素,则第二个以下将起作用

List keys = new ArrayList(map.keySet());
Object obj = map.get(keys.get(1));
    //do you staff here 
于 2013-06-13T13:58:00.117 回答
0

您还可以使用 apache commons-collection 中的 org.apache.commons.collections.map.ListOrderedMap。它实现 Map 并提供 List 接口的一些方法,如 get(int index) 和 remove(int index)。

它在内部使用 ArrayList,因此性能将优于在 Map 上迭代以检索指定位置的值。

于 2013-06-13T13:41:32.793 回答
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);
于 2013-06-13T13:37:56.823 回答
0

如果您只需要一直获取第二个元素。为什么不使用迭代器,然后执行下一个,下一个。

于 2013-06-13T13:32:56.400 回答
0

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"

这就是你想要的。

于 2013-06-13T13:31:05.673 回答
0

index 的定义不适用于Map,因为默认情况下它不是有序集合。

您可以使用 a TreeMap,它实现NavigableMap,然后使用该navigableKeySet()方法迭代密钥集。

于 2013-06-13T13:32:28.527 回答