如何在Java中对嵌套列表进行排序

时间:2019-01-09 09:32:16

标签: java sorting collections java-8

我有一个像下面这样的json:

list.forEach(studentObj -> {
    studentObj.getSubjects()
      .sort(Comparator.nullsLast(Comparator.comparing(Subject:: getSubjectCode)));
  });

我想对每个学生的科目列表进行排序,然后按卷编号对学生对象进行排序。可以用java8在一行中完成。

我正在使用以下代码:

  list.sort(Comparator.nullsLast(Comparator.comparing(Student:: getRollNo)));

然后对外部对象进行排序

{{1}}

4 个答案:

答案 0 :(得分:2)

将其解析为对象后,您可以编写如下内容:

List<Student> sorted = students.stream()
            .map(f -> new Student(f.getId(), f.getSubjects().stream().sorted(Comparator.comparing(Subject::getSubjectCode)).collect(Collectors.toList())))
            .sorted(Comparator.comparing(Student::getRollNo))
            .collect(Collectors.toList())

答案 1 :(得分:2)

如果您要使用自己的2个类StudentSubject实现Comparable interface,则可以使它变得非常好而简短,因为可以使用Comparator.naturalOrder()静态工厂方法

它还允许您通过简单地更改其Subjects方法来更改想要定义StudentscompareTo的方式

学生

class Student implements Comparable<Student> {
    String name;
    int rollNo;
    List<Subject> subjects = new ArrayList<>();

    // GETTERS/SETTERS

    @Override
    public int compareTo(Student student) {
        return Integer.compare(this.getRollNo(), student.getRollNo());
    }

}

主题

class Subject implements Comparable<Subject> {
    String subjectCode;

    // GETTERS/SETTERS

    @Override
    public int compareTo(Subject subject) {
        return this.getSubjectCode().compareTo(subject.getSubjectCode());
    }

}

然后

// static import to make code lighter
import static java.util.Comparator.*;

// sort Students list, then sort Subjects list in each Student
list.sort(nullsLast(naturalOrder()));
list.forEach(s -> { if (s != null) {
   s.getSubjects().sort(nullsLast(naturalOrder())); 
}});

一个班轮版本,如果您确实需要

List<Student> sortedList = list.stream()
    .map(s -> {
        if (s != null) {
            s.getSubjects().sort(nullsLast(naturalOrder()));
        }
        return s;
    }).sorted(nullsLast(naturalOrder()))
    .collect(Collectors.toList());

答案 2 :(得分:0)

以下是一些使用Java流入门的示例。

List<String> sorted = new ArrayList<>(Arrays.asList("Input1", "Input2", "Etc")).stream().sorted((a, b) -> a.compareTo(b));


List<String> sorted = json.stream().sorted((a, b) -> a.compareTo(b));


List<String> sorted = json.stream().sorted();

这里是如何对列表中的所有列表进行排序,因此您现在可以进行重构以使其成为一个衬里

void method() {
    sort(list);
}

void sort(List list) {
    if (list.size() == 0)
        return;

    list.stream().sorted();
    for (Object o : list)
        if (o instanceof List)
            sorted((List) o);
}

以下是对Java流的一些引用:

API文档:

https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

示例:

https://stackify.com/streams-guide-java-8/

https://www.geeksforgeeks.org/stream-in-java/

答案 3 :(得分:-1)

尝试这个

List<Student> result = new ArrayList<>();
studentList.stream()
           .sorted(Comparator.comparingInt(Student::getRollNo))
           .map(student -> {
                student.getSubjects().sort(Comparator.nullsLast(Comparator.comparing(Subjects::getSubjectCode)));
                return student;
            }).collect(Collectors.toList());