从索引创建子列表

时间:2015-10-25 15:20:26

标签: java list java-8 java-stream sublist

是否可以仅使用元素索引从另一个列表创建子列表? 我正在寻找好的解决方案,例如lambda,来自Java 8的流。

例如(伪代码):

a = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
b = a.getByIndices([0, 2, 4, 5, 3])
print(b) // [10, 8, 6, 5, 7]

4 个答案:

答案 0 :(得分:7)

您可以使用以下方法:

private static <T> List<T> getByIndices(List<T> list, List<Integer> indexes) {
    return indexes.stream().map(list::get).collect(toList());
}

这将从给定索引创建Stream,映射到索引处列表的元素,并将结果收集到列表中。

样本用法:

List<Integer> list = Arrays.asList(10, 9, 8, 7, 6, 5, 4, 3, 2, 1);
List<Integer> indexes = Arrays.asList(0, 2, 4, 5, 3);
System.out.println(getByIndices(list, indexes)); // prints [10, 8, 7, 6, 5]

答案 1 :(得分:6)

对于整数数组,你可以使用它:

int[] b = IntStream.of(0, 2, 4, 5, 3)
      .map(i -> a[i])
      .toArray();

答案 2 :(得分:1)

扩展AbstractList是一种快速启动和运行列表实现的方法。与常规List.subList方法一样,以下子列表由主列表支持,因此对子列表的更改将写入主列表(可能是也可能不是您想要的功能,但您始终可以创建如果需要,从子列表中新建,单独的ArrayList)。通过子列表删除元素未实现;它是可行的,但需要更多的工作。

public static <E> List<E> sublistFromIndices(List<E> list, int... indices) {
    Objects.requireNonNull(list);
    Objects.requireNonNull(indices);
    return new AbstractList<E>() {
        @Override
        public int size() {
            return indices.length;
        }

        @Override
        public E get(int index) {
            return list.get(indices[index]);
        }

        @Override
        public E set(int index, E element) {
            return list.set(indices[index], element);
        }
    };
}

答案 3 :(得分:0)

我写了这个函数来做你要求的。我无法弄清楚如何使它成为lambda函数,但我会继续研究它。

public static <E> void createSublist(List<E> oldList, List<E> newList, int[] indicies){
        for(int i = 0; i < indicies.length; i++)
             newList.add(oldList.get(indicies[i]));} //Adds indicies to new list