Как отсортировать поля из двух разных классов в списке? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть код ниже, где мне нужно отсортировать список на основе полей из разных классов.

Можно ли отсортировать данные по полям из разных классов и объединить их в один список?

import java.util.*;
import java.util.stream.Collectors;

public class Sample4 {

    private class Student {
        String name;
        Set<Marks> marks;

    }

    private class Marks {
        double points;
    }

    public static void main(String[] args) {
        System.out.println(new Sample4().test());
    }

    public List<Marks> test() {
        Set<Marks> marks = new LinkedHashSet<>(), marks1 = new LinkedHashSet<>(), marks2 = new LinkedHashSet<>();
        marks.add(new Marks(10.2));
        marks.add(new Marks(2.10));
        marks1.add(new Marks(20));
        marks1.add(new Marks(7));
        marks2.add(new Marks(13));
        marks2.add(new Marks(15));

        List<Student> stds = Arrays.asList(
                new Student("A", marks),
                new Student("C", marks1),
                new Student("B", marks2)
        );

        return stds.stream().sorted(Comparator.comparing(Student::getName)).flatMap(std -> std.getMarks().stream()).sorted(Comparator.comparing(Marks::getPoints)).collect(Collectors.toList());
    }
}

Пожалуйста, ознакомьтесь с кодом выше для справки. Но вывод, который я ищу, следующий:

A -> 2,10, 10,2

B -> 13, 15

C -> 7, 20

1 Ответ

0 голосов
/ 02 апреля 2020

Если вы хотите, чтобы вывод состоял из ссылки между именем студента A и такими отметками, как 2.10 и 10.2, то вам нужно либо вывод Map<String, List<Mark>>, либо использовать текущий List<Student, то есть просто отсортировано, как вам нужно:

Вывод List<Student>:

return stds.stream()
  .sorted(Comparator.comparing(Student::getName))              // sort Students by name
  .map(student -> new Student(                                 // with sorted marks
     student.getName(),                                        // - same name
     student.getMarks().stream()                               // - sorted marks
       .sorted(Comparator.comparingDouble(Marks::getPoints))   // -- comparing points
       .collect(Collectors.toCollection(LinkedHashSet::new)))) // -- as LinkedHashSet
  .collect(Collectors.toList());                               // as List<Student>

[Студент (имя = A, оценки = = Оценки (баллы = 2,1), Оценки ( очки = 10,2)]),

студент (имя = B, оценки = [Fooarks (очки = 13,0), оценки (очки = 15,0)]),

студент (имя = C, marks = [Marks (points = 7.0), Marks (points = 20.0)])]


Если вы находите Map<String, List<Mark>> как-то более подходящим, тогда обратите внимание на реализацию TreeMap сортирует ключи:

return stds.stream()
    .collect(Collectors.toMap(                           // Map<String, List>
         Student::getName,                               // the key
         student -> student.getMarks().stream()          // the value (sorted)
             .sorted(Comparator.comparingDouble(
                     Marks::getPoints))
             .collect(Collectors.toList()),
         (o1, o2) -> o1,                                 // merge BinaryOperator
         TreeMap::new));                                 // requested implementation

{A = [Foo.Marks (points = 2.1), Foo.Marks (points = 10.2)],

B = [Foo .Marks (точки = 13,0), Foo.Marks (точки = 15,0)],

C = [Foo.Marks (точки = 7,0), Foo.Marks (точки = 20,0)]}

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