как сортировать вложенные списки в Java - PullRequest
0 голосов
/ 09 января 2019

У меня есть JSON, как показано ниже:

{ 
  "Student": [
    {  
      "name":"5",
      "Roll No":12345,
      "Subjects":[  
        {  
           "subjectCode":"Mat"
        },
        {  
           "subjectCode":"Sci"
        }
      ]
    } 
  ]
}

Я хочу отсортировать список предметов в каждом ученике, а затем сортировать предметы ученика с помощью рулона №. Это можно сделать с помощью java8 в одну строку.

Я использую код ниже:

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

затем сортировка внешнего объекта

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

Ответы [ 4 ]

0 голосов
/ 09 января 2019

Если бы вы реализовали Comparable интерфейс с вашими 2 классами Student и Subject, вы могли бы сделать его действительно красивым и коротким, потому что вы можете использовать Comparator.naturalOrder () статический фабричный метод

Также это позволяет вам изменить способ определения порядка Subjects или Students, просто изменив их compareTo метод

Student

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());
0 голосов
/ 09 января 2019

После анализа объекта вы можете написать что-то вроде следующего:

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())
0 голосов
/ 09 января 2019

Попробуйте это

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());
0 голосов
/ 09 января 2019

Вот несколько примеров, которые помогут вам начать работу с использованием потоков 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...