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

Anu*_*oni 7 java sorting collections java-8

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

{ 
  "Student": [
    {  
      "name":"5",
      "Roll No":12345,
      "Subjects":[  
        {  
           "subjectCode":"Mat"
        },
        {  
           "subjectCode":"Sci"
        }
      ]
    } 
  ]
}
Run Code Online (Sandbox Code Playgroud)

我想对每个学生中的主题列表进行排序,然后用滚动号排序学生对象.可以用单行java8完成.

我使用下面的代码:

list.forEach(studentObj -> {
    studentObj.getSubjects()
      .sort(Comparator.nullsLast(Comparator.comparing(Subject:: getSubjectCode)));
  });
Run Code Online (Sandbox Code Playgroud)

然后排序外部对象

  list.sort(Comparator.nullsLast(Comparator.comparing(Student:: getRollNo)));
Run Code Online (Sandbox Code Playgroud)

Ben*_*aye 5

如果您要使用2 个类实现Comparable 接口Student,并且Subject可以使其变得非常漂亮和简短,因为您可以使用Comparator.naturalOrder()静态工厂方法

它还允许您通过简单地更改其方法来更改定义方式SubjectsStudents订购方式compareTo

学生

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());
    }

}
Run Code Online (Sandbox Code Playgroud)

主题

class Subject implements Comparable<Subject> {
    String subjectCode;

    // GETTERS/SETTERS

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

}
Run Code Online (Sandbox Code Playgroud)

进而

// 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())); 
}});
Run Code Online (Sandbox Code Playgroud)

如果您确实需要,可提供一款内衬版本

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


Joe*_*Joe 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();
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

以下是对 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/