迭代在索引处找到Map条目?

我有一个LinkedHashMap。 我想在索引N处得到Foo。除了迭代之外,有没有更好的方法来执行此操作直到我找到它?

int target = N; int index = 0; for (Map.Entry it : foos.entrySet()) { if (index == target) { return it.getValue(); } index++; } 

对于某些操作,我必须通过索引从地图中获取大约50次的随机元素。 地图中将包含大约20个项目。

谢谢

 List> randAccess = new ArrayList>(foos.entrySet()); 

然后索引N与O(1)访问…

 randAccess.get(N) 

@Mark的解决方案是现货。 我只想指出地图(任何类型)中条目的偏移(位置)不稳定。 每次添加或删除条目时,其余条目的偏移量可能会发生变化。 对于HashMap或LinkedHashMap,您无​​法知道哪个条目的偏移量会发生变化。

  • 对于常规HashMap,单个插入显然可以“随机化”条目偏移。
  • 对于LinkedHashMap,条目的顺序是稳定的,实际的条目偏移不是。

对于所有标准映射实现,偏移的不稳定性以及在给定偏移处找到条目的事实是昂贵的,这是Map接口不提供get(int offset)方法的原因。 它还应该暗示一个算法需要做这种事情并不是一个好主意。

简化@ Mark的解决方案……您只需要值,因此每次更改foos Map中的值时,也会更新数组。

 Map foos =; Foo[] fooValues = {}; foos.put(foos.name(), foo); fooValues = foos.values().toArray(new Foo[foos.size()]); // later Foo foo = fooValues[N]; 

在这种情况下,番石榴库可以提供帮助:

 public static  T com.google.common.collect.Iterables.get(Iterable iterable, int position) 

请参阅javadoc:Iterables.get

对于您的情况,代码可以是这样的:

 Iterables.get(foos.values(), N);