Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 迭代以在索引处查找映射项?_Java - Fatal编程技术网

Java 迭代以在索引处查找映射项?

Java 迭代以在索引处查找映射项?,java,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++; } int目标=N; int指数=0; 对于(Map.Entry i

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

int target = N;
int index = 0;
for (Map.Entry<String, Foo> it : foos.entrySet()) {
    if (index == target) {
        return it.getValue();
    }
    index++;
}
int目标=N;
int指数=0;
对于(Map.Entry it:foos.entrySet()){
如果(索引==目标){
返回它。getValue();
}
索引++;
}
对于某些操作,我必须通过索引从地图中获取大约50次的随机元素。地图上大约有20个项目


谢谢

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

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

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

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

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

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

// later
Foo foo = fooValues[N];
mapfoos=;
Foo[]fooValues={};
put(foos.name(),foo);
fooValues=foos.values().toArray(新的Foo[foos.size()]);
//后来
Foo-Foo=fooValues[N];

番石榴库在这种情况下有帮助:

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

我想我可能有相同的评论,除了OP使用LinkedHashMap,它保留了一个条目的链接列表,对应于迭代的插入顺序…因此迭代的顺序随着时间的推移是稳定的…没有?你已经花了O(N)创建了映射中所有键的副本。如果地图中插入了任何内容,则不会更新您的副本。对于初始副本之后的连续查询,它仅为O(1)。
Map<String, Foo> foos =;
Foo[] fooValues = {};

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

// later
Foo foo = fooValues[N];
public static <T> T com.google.common.collect.Iterables.get(Iterable<T> iterable, int position)
Iterables.get(foos.values(), N);