Сбор и упорядочивание числовых значений

Подсчитайте частоты в HashMap, затем скопируйте их в TreeMap с обратным Comparator. execute и sort могут возвращать this для цепочки вызовов, а get — защищённую копию.

Короткий ответ

Что ответить на собеседовании

Подсчитайте частоты в HashMap, затем скопируйте их в TreeMap с обратным Comparator. execute и sort могут возвращать this для цепочки вызовов, а get — защищённую копию.

Подробный разбор

Ответ с пояснениями

Условие

Реализовать класс GroupedCounterAlgorithm, обеспечивающий следующие операции:

  1. Метод execute(long[] numbers)

    • Проанализировать входной массив numbers и определить, какие значения в нём встречаются.

    • Сформировать структуру Map<Long, Long>, где:

      • ключ – конкретное число из массива;
      • значение – количество его появлений.
  2. Метод sort()

    • Отсортировать сформированную карту по убыванию ключа (т. е. от наибольшего числа к наименьшему).
  3. Метод 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). Реализация не предназначена для одновременных вызовов из разных потоков.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее