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

时间:2010-10-09 02:56:37

标签: java

我有一个LinkedHashMap。我想在索引N处得到Foo。除了迭代之外,还有更好的方法吗?直到找到它?:

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

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

由于

4 个答案:

答案 0 :(得分:14)

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

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

randAccess.get(N)

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

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

Map<String, Foo> foos =;
Foo[] fooValues = {};

foos.put(foos.name(), foo);
fooValues = foos.values().toArray(new Foo[foos.size()]);

// later
Foo foo = fooValues[N];

答案 3 :(得分:0)

Guava库在这种情况下可以提供帮助:

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

see javadoc: Iterables.get

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

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