Вы хотите сначала заполнить карту всеми целыми числами, где каждое целое число является ключом, а частота - значением. Если вы встречаете существующее целое число, вы увеличиваете частоту (значение).
Затем вы сортируете записи в этой карте по их значениям (частотам) и просто помещаете результат в список.
Теперь у вас есть отсортированный список наборов записей, где ключ - это целое число, а значение - это частота, к которой вы можете просто получить доступ по индексу:
public static void main(final String[] args) {
final int integers[] = new int[] {3, 1, 1, 1, 13, 13, 13, 13, 13, 8, 8, 8, 8, 8, 8};
final Map<Integer, Integer> integerFrequencies = new HashMap<>();
// Create a map of all integers with their frequency:
for (final int i : integers) {
if (integerFrequencies.containsKey(i)) {
integerFrequencies.put(i, integerFrequencies.get(i) + 1);
}
else {
integerFrequencies.put(i, 1);
}
}
// Sort the map entries by their value (frequency) into a list:
final var integerFrequenciesSorted = integerFrequencies.entrySet().stream().sorted(Collections.reverseOrder(Map.Entry.comparingByValue())).collect(Collectors.toList());
// Print 2nd to 4th entry:
for (int i = 1; i < 4; i++) {
final var integerFrequency = integerFrequenciesSorted.get(i);
System.out.println("Value: " + integerFrequency.getKey() + ". Frequency: " + integerFrequency.getValue());
}
}
печатает:
Значение: 13. Частота: 5
Значение: 1. Частота: 3
Значение: 3. Частота: 1