我有一个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个项目。
由于
答案 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,您无法知道哪个条目的偏移量会发生变化。
对于所有标准映射实现,偏移的不稳定性以及在给定偏移处查找条目的事实是昂贵的,这是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)
对于您的情况,代码可以是这样的:
Iterables.get(foos.values(), N);