在常量时间

时间:2017-04-29 10:18:02

标签: java list collections java-8

在常量时间内通过索引从列表中获取多个元素的最佳方法是什么?

如果我有阵列:

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"

更新 物品的印刷当然不必是恒定的时间,只是收集物品。上面打印元素的代码仅用于演示目的。

3 个答案:

答案 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)