Сортировка этой картына Яве - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть карта, где FullName является объектом и содержит другой объект класса Name, который содержит FirstName и LastName. Имя и фамилия - Строка. (Да, я знаю, что это плохой дизайн, но я пытаюсь научиться сортировке)

Строка ключа - это просто идентификаторы, такие как 1,2,3, ...

Я хочу отсортировать по полному имени (как по имени, так и по фамилии) и просто вернуть список идентификаторов.

Это код, который у меня есть, но я получаю синтаксическую ошибку в отсортированной части, где я передаю компаратор. И также я вполне уверен, что я делаю что-то неправильно семантически тоже.

List<String> listofIds = map.entrySet().stream()
            .sorted(new ValueComparator(map))
            .map(Map.Entry::getKey)
            .collect(toList());

class ValueComparator implements Comparator<String> {
    Map<String, FullName> base;

    public ValueComparator(Map<String, FullName> base) {
        this.base = base;
    }

    public int compare(String a, String b) {
        FullName fullName1 = base.get(a);
        FullName fullName2 = base.get(b);
        return(fullName1.getName().getFirstName()
               .compareTo(fullName2.getName().getFirstName()));
    }
}

1 Ответ

0 голосов
/ 16 ноября 2018

Ваш компаратор предназначен для String объектов, но map.entrySet().stream() возвращает поток Entry<String, FullName> объектов.

Как было предложено JB в комментариях, вы можете использовать статический Comparator метод #comparing для быстрого создания Comparator:

List<String> listofIds = map.entrySet().stream().sorted(
  Comparator.comparing(e -> e.getValue().getName().getFirstName())
).map(Map.Entry::getKey).collect(toList());

Вы можете воспользоваться Comparator, являющимся функциональным интерфейсом, подобным следующему:

List<String> listofIds = map.entrySet().stream().sorted(
    (e1, e2) -> e1.getValue().getName().getFirstName().compareTo(
       e2.getValue().getName().getFirstName())
).map(Map.Entry::getKey).collect(toList());

Если вы все еще хотите использовать Comparator объект, вы можете использовать:

private static class ValueComparator implements Comparator<Entry<String, FullName>> {

  @Override
  public int compare(Entry<String, FullName> e1, Entry<String, FullName>> e2) {
    FullName fullName1 = e1.getValue();
    FullName fullName2 = e2.getValue();
    return fullName1.getName().getFirstName()
           .compareTo(fullName2.getName().getFirstName());
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...