使用java8我们如何从第二个元素到最后一个元素排序元素?

时间:2017-06-09 15:47:44

标签: java-8

使用java8我们如何对从第二个元素开始到最后一个元素的元素进行排序?

  list.stream().filter(student -> student.getAge()!=15).sorted(Comparator.comparing(student->student.getAge())).collect(Collectors.toList());

最终排序列表应包含所有元素,包括第一个元素。

我已尝试过以上代码段:

这里我不想触及第一个元素。上面的代码是从第二个元素到最后一个元素的排序。问题是我没有得到输出中的第一个元素(年龄= 15)。

如果我不应用过滤器,它将对所有元素进行排序,我将松开第一个元素,这不应该发生。

请帮助我。谢谢。

4 个答案:

答案 0 :(得分:4)

 List<Student> result = Stream.concat(
            list.stream().findFirst().map(Stream::of).orElse(Stream.empty()),
            list.stream().skip(1).sorted(Comparator.comparing(Student::getAge)))
            .collect(Collectors.toList());

    System.out.println(result);

答案 1 :(得分:2)

您可以使用List.subList方法跳过列表的第一个元素:

List<Student> result = list.isEmpty() ? new ArrayList<>() : // or just list
    Stream.concat(
        Stream.of(list.get(0)),
        list.subList(1, list.size()).stream()
            .sorted(Comparator.comparing(Student::getAge)))
    .collect(Collectors.toList());

答案 2 :(得分:2)

重新思考Stream API是否是最佳选择:

List<Student> result = new ArrayList<>(list);
result.subList(1, list.size()).sort(Comparator.comparing(Student::getAge));

请注意,如果源列表是可变的并且您不需要原始列表顺序,则可以仅使用上面代码片段的第二行直接在源列表上执行操作。

答案 3 :(得分:0)

试试这个,你可以在处理整个列表后过滤第一个元素:

inputx.split("\n").map{|s| s.split(/;-?/)}
#=> [[" baseball", "1"], ["    norm", "4"], ["   dad", "3"], ["   soda", "1"], ["  robot", "8"], ["   mmm", "3"], ["      fly", "1"], ["    cat", "4"], ["    bird", "4"], ["   dragon", "6"], ["  mor", "1"]]