Сортировка без исходного кода класса

Вопрос интервьюера в одном из моих интервью.

We have Employee class with id, firstName, and lastName fields and getters and setters of these fields. We do not have source code of this class, it is in JAR. We are using Employee instances as the key in TreeMap. Now we want to sort this TreeMap based on the Employeeid field.

Я знаю, что мы можем использовать интерфейс Comparable для сортировки, но как мы можем его использовать, если у нас нет исходного кода?

Вы можете использовать компаратор.

Eran 02.05.2018 08:58

Почему исходный код вообще может быть актуален?

lexicore 02.05.2018 09:00

Используйте компаратор, например stackoverflow.com/questions/18720800/…

sashwat 02.05.2018 09:00

@lexicore Тот факт, что у вас нет исходного кода, не позволяет вам реализовать класс Comparable. Они хотят альтернативы, то есть для ответа, что вы можете дать Comparator на TreeMap конструктор. Это тест, чтобы увидеть, насколько вы знакомы с TreeMap, одним из наиболее распространенных классов в Java Runtime Library.

Andreas 02.05.2018 09:02

Возможный дубликат Сортировка карты с помощью компаратора

contrapost 02.05.2018 09:10

@Andreas Вы не можете заставить сторонний класс реализовать Comparable независимо от того, доступен ли исходный код или нет. Поэтому я до сих пор не понимаю, насколько важна доступность исходного кода.

lexicore 02.05.2018 10:23

@contrapost Конечно дубликат, но только для тех, кто уже знает :) Если кто не знает о существовании Comparator, то вопрос разные. Он должен оставаться здесь.

Honza Zidek 02.05.2018 10:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
84
2

Ответы 2

На основе Комментарий Андреаса:

Поскольку у вас нет исходного кода, вы не можете использовать сопоставимый интерфейс. И цель вашего интервьюера - заставить вас использовать альтернативу. Эта альтернатива - использовать Компаратор.

Я дам поискать, как им пользоваться (вот пример)

У вас есть два варианта:

  1. Подкласс Employee и реализация производного класса Comparable<...>
  2. Напишите Comparator<Employee> и передайте его в качестве параметра конструктору TreeMap.

Первое - больше проблем, чем оно того стоит, потому что вы имеете дело с другим классом. Итак, давайте посмотрим на использование Comparator.

final Comparator<Employee> employeeComparator = Comparator
        .comparing(Employee::getLastName)
        .thenComparing(Employee::getFirstName);
final SortedMap<Employee, String> map = new TreeMap<>(employeeComparator);

Это определяет компаратор как лямбда Java 8, который сначала сравнивает фамилию, а затем имя.

Другие вопросы по теме