通过索引访问地图?

时间:2013-06-13 13:27:27

标签: java

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

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

8 个答案:

答案 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