Сортировать список внутри объекта с помощью компараторов java 8 - PullRequest
0 голосов
/ 04 сентября 2018

Я хочу отсортировать список внутри объекта с помощью компараторов Java 8.
Может кто-нибудь помочь мне заменить это здесь -> thenComparing (???)



@Test
public void testSort() {
    // given
    List<Person> values = Lists.newArrayList(
            new Person("you", Lists.newArrayList(new Todo("A"))),
            new Person("me", Lists.newArrayList(new Todo("B"), new Todo("A"), new Todo("C"))),
            new Person("me", Lists.newArrayList(new Todo("A"))),
            new Person("me", Lists.newArrayList(new Todo("D")))
    );

    // when
    List<Person> result = values
            .stream()
            .sorted(Comparator
                    .comparing(Person::getName))
                    .thenComparing(???) <-- TODO
            .collect(Collectors.toList());

    // then
    assertEquals(4, result.size());

    Person person_1 = result.get(0);
    assertEquals("me", person_1.getName());
    assertEquals(1, person_1.getTodos().size());
    assertEquals("A", person_1.getTodos().get(0).getName());

    Person person_2 = result.get(1);
    assertEquals("me", person_2.getName());
    assertEquals(3, person_2.getTodos().size());
    assertEquals("A", person_2.getTodos().get(0).getName());
    assertEquals("B", person_2.getTodos().get(1).getName());
    assertEquals("C", person_2.getTodos().get(2).getName());

    Person person_3 = result.get(2);
    assertEquals("me", person_3.getName());
    assertEquals(1, person_3.getTodos().size());
    assertEquals("D", person_3.getTodos().get(0).getName());

    Person person_4 = result.get(3);
    assertEquals("you", person_4.getName());
    assertEquals(1, person_4.getTodos().size());
    assertEquals("A", person_4.getTodos().get(0).getName());

}

@Data
@AllArgsConstructor
class Todo {

    private String name;
}

@Data
@AllArgsConstructor
class Person {

    private String name;
    private List<Todo> todos;
}

Ожидаемый результат сортировки:
Персона (имя = я, задачи = [Todo (имя = A)])
Персона (имя = я, задачи = [Todo (имя = A), Todo (имя = B), Todo (имя = C)])
Персона (имя = я, задачи = [Todo (имя = D)])
Персона (имя = вы, todos = [Todo (имя = A)])

1 Ответ

0 голосов
/ 04 сентября 2018

Редактируя классы Person и Todo, в сочетании с тем фактом, что сортировка String встроена в Java, это становится проще.

Итак, давайте сначала подумаем об этом, мы можем использовать thenComparing после первого comparing, приведя список Todo к строке, а затем отсортировав по этой строке. сначала мы редактируем класс Person, добавляя функцию, которая возвращает список Todo в виде строки. Это будет выглядеть как:

public class Person {
    private String name;
    private List<Todo> todos;

    public Person(String name, List<Todo> todos) {
        this.name = name;
        this.todos = todos;
    }

    public String getName() {
        return name;
    }
    public List<Todo> getTodos() {
        return todos;
    }

    public String getTodoListAsString() {
        return this.todos.stream()
                .map(Todo::getName)
                .sorted()
                .collect(Collectors.joining());
    }
}

Мы также хотим изменить класс Todo для реализации Comparable, чтобы мы могли отобразить список Todo в них в отсортированный список. Мы можем сделать это, отредактировав класс Todo следующим образом:

public class Todo implements Comparable<Todo> {
    private String name;

    public Todo(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public int compareTo(Todo o) {
        return this.getName().compareTo(o.getName());
    }
}

Теперь мы можем использовать это в потоке как таковое:

List<Person> result = values
            .stream()
            .sorted(Comparator.comparing(Person::getName)
                    .thenComparing(Person::getTodoListAsString))
            .map(person -> new Person(person.getName(),
                    person.getTodos()
                            .stream()
                            .sorted()
                            .collect(Collectors.toList())))
            .collect(Collectors.toList())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...