Подсчитайте частоты в HashMap, затем скопируйте их в TreeMap с обратным Comparator. execute и sort могут возвращать this для цепочки вызовов, а get — защищённую копию.
Сбор и упорядочивание числовых значений
Подсчитайте частоты в HashMap, затем скопируйте их в TreeMap с обратным Comparator. execute и sort могут возвращать this для цепочки вызовов, а get — защищённую копию.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Реализовать класс GroupedCounterAlgorithm, обеспечивающий следующие операции:
-
Метод execute(long[] numbers)
-
Проанализировать входной массив numbers и определить, какие значения в нём встречаются.
-
Сформировать структуру
Map<Long, Long>, где:- ключ – конкретное число из массива;
- значение – количество его появлений.
-
-
Метод sort()
- Отсортировать сформированную карту по убыванию ключа (т. е. от наибольшего числа к наименьшему).
-
Метод get()
- Вернуть уже отсортированную карту
Map<Long, Long>.
- Вернуть уже отсортированную карту
public class GroupedCounterAlgorithm implements Algorithm<long[], Map<Long, Long>> {
@Override
public Algorithm<long[], Map<Long, Long>> execute(long[] numbers) {
return null;
}
@Override
public Algorithm<long[], Map<Long, Long>> sort() {
return null;
}
@Override
public Map<Long, Long> get() {
return null;
}
}
Ответ
Подсчитайте частоты в HashMap, затем скопируйте их в TreeMap с обратным Comparator. execute и sort могут возвращать this для цепочки вызовов, а get — защищённую копию.
Фрагмент класса из условия, imports java.util опущены:
private Map<Long, Long> counts = new HashMap<>();
@Override
public Algorithm<long[], Map<Long, Long>> execute(long[] numbers) {
Map<Long, Long> next = new HashMap<>();
for (long value : numbers) next.merge(value, 1L, Long::sum);
counts = next;
return this;
}
@Override
public Algorithm<long[], Map<Long, Long>> sort() {
Map<Long, Long> sorted = new TreeMap<>(Comparator.reverseOrder());
sorted.putAll(counts);
counts = sorted;
return this;
}
@Override
public Map<Long, Long> get() {
return Collections.unmodifiableMap(new LinkedHashMap<>(counts));
}
Порядок использования: execute(numbers).sort().get(). Повторный execute начинает новый подсчёт. Время O(n+k log k), память O(k). Реализация не предназначена для одновременных вызовов из разных потоков.