首页 > 解决方案 > 使用 Stream 按给定的索引序列排序

问题描述

我尝试考虑是否可以使用按索引进行排序。我所有的搜索总是指向通过将对象值与其他对象值进行比较来进行排序。 以下是示例数据和预期结果:

List<Movie> movies = new ArrayList<>();
movies.add(new Movie(1, "Movie1"));
movies.add(new Movie(2, "Movie2"));
movies.add(new Movie(3, "Movie3"));
movies.add(new Movie(4, "Movie4"));

int[] sortIndex = [0, 3, 1, 2];
...Sorting Code...
for (Movie movie : movies) {
    Log.d(TAG, movie.getName());
}

预期的答案应该是

Movie1
Movie4
Movie2
Movie3

标签: javaandroidsortingjava-8java-stream

解决方案


一种简单的方法是遍历Array,然后将每个 int 映射到 的相应索引List,然后将其收集到 a List

List<Movie> newList = Arrays.stream(sortIndex)
                            .mapToObj(e -> movies.get(e))
                            .collect(Collectors.toList());

这将产生List

[Movie1, Movie4, Movie2, Movie3]

您可以创建一个方法来执行此操作:

public <T> List<T> sortList(int[] sortOrder, List<T> list) {
    return Arrays.stream(sortOrder)
                 .mapToObj(e -> list.get(e))
                 .collect(Collectors.toList());
}

推荐阅读