使用java中的索引访问映射

时间:2014-06-17 12:26:09

标签: java hashmap

为什么Java map.get(index)中没有HashMap

要访问HashMap中第一个键的值,我必须将密钥放入列表中list.get(0),然后将其传递给map.get(list.get(0));我觉得这很笨拙。为什么会这样?

从<{1}}访问“第一个或第二个元素”的正确的方法是什么?

(请不要建议“将HashMap转换为HashMap并通过LinkedHashMap访问它。”

7 个答案:

答案 0 :(得分:3)

要求HashMap的“第一个elemet”没有意义,因为顺序可以(并且通常会)随着元素的添加和删除而改变。

HashMap

的文档中对此进行了解释
  

“......不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。”

您可以使用以下实验进行测试:

import java.util.HashMap;
public class M {
public static void main(String[] args) {
   HashMap<String, Integer> m = new HashMap<String, Integer>();
   for (int i=1, p=1; i<100000; i++) {
      m.put(""+i, i);
      if (i == p) { 
         p <<= 1;  // keys are reordered at power-of-two multiples
         System.out.println("at " + p + ": first is now " 
            + m.keySet().iterator().next());
      }
   }
}
}    

输出为(JDK 1.7):

at 2: first is now 1
at 4: first is now 2
at 8: first is now 3
at 16: first is now 3
at 32: first is now 15
at 64: first is now 19
at 128: first is now 35
at 256: first is now 35
at 512: first is now 35
at 1024: first is now 338
at 2048: first is now 338
at 4096: first is now 1411
at 8192: first is now 3280
at 16384: first is now 6873
at 32768: first is now 10997
at 65536: first is now 10997
at 131072: first is now 10997

如果您需要可重复排序(=迭代元素将始终为您提供插入顺序),您始终可以使用LinkedHashMap。请注意,它们需要更多的内存,并且比标准品种稍慢。

答案 1 :(得分:2)

HashMap没有排序:HashMap中的索引i没有任何意义。

您只能使用密钥访问它。

答案 2 :(得分:1)

请参阅http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

&#34;此课程不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。&#34;

所以没有第一个或第二个元素......

答案 3 :(得分:0)

如果元素的顺序对您很重要,则不应使用Hashmap。 Hashmap不是有序的数据结构。

答案 4 :(得分:0)

根据定义,地图(ping)在键或值上没有排序,这就是原因。

如果您查看JavaDoc,您会看到例如。密钥以Set而不是List返回。

我想你可以定义一个特殊的地图,例如保留。插入顺序,但不符合Java版本中的合同,后者明确指出它

  

“......不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。”

干杯,

答案 5 :(得分:0)

HashMap内部使用SetOrder is not preserved。因此,您无法使用索引访问它。

答案 6 :(得分:0)

不确定您是否正在寻找:Iterate to find a Map entry at an index?或其他

List<Entry<String,Foo>> randAccess = new ArrayList<Entry<String,Foo>>(foos.entrySet());
randAccess.get(N)