在常量时间内通过索引从列表中获取多个元素的最佳方法是什么?
如果我有阵列:
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
我有一个带索引的列表/数组:
List<Integer> indices = new ArrayList<>();
indices.add(0);
indices.add(2);
indices.add(3);
如何在恒定时间内获得a,c,d? 我需要这样的东西:
List<String> filtered = list.filterByIndex(indices);
filtered.stream().forEach(x -> System.out.print(x));
// output:"acd"
更新 物品的印刷当然不必是恒定的时间,只是收集物品。上面打印元素的代码仅用于演示目的。
答案 0 :(得分:6)
我建议:
List<String> filtered = indices.stream()
.map(list::get)
.collect(Collectors.toList());
结果是理想的:
[a, c, d]
假设列表具有恒定时间访问权限(如ArrayList
所示),则此时间与所请求的元素数量(indices
的长度)成线性关系,但不随之增加列表list
的长度。正如评论中所讨论的那样,这是我们能做的最好的事情。
编辑:老实说我不知道上面的收集步骤是否在收集元素数量的线性时间内。可能是列表容量成本增加的时间延长,并且这可能不会超过线性时间。如果我们需要确定,我们需要采用这种方式:
.collect(Collectors.toCollection(() -> new ArrayList<>(indices.size())));
这确保从一开始就分配具有适当容量的列表,因此不需要扩展。
答案 1 :(得分:3)
创建列表:
List<String> filtered = new ArrayList<>();
indices.forEach(index -> filtered.add(list.get(index)));
System.out.println(filtered);
流和地图解决方案
List<String> filtered = indices.stream()
.map(index -> list.get(index))
.collect(Collectors.toList());
如果只需要字符串,可以使用StringBuilder
StringBuilder sb = new StringBuffer();
indices.forEach(index -> sb.append(list.get(index)));
System.out.println(sb.toString());
答案 2 :(得分:1)
您可能会这样做:
listview.setEnabled(false)