Добрые день, вечер, утро или что-там у вас...
Может быть я как-то по-другому условие задачи вижу? или может быть порядок вывода байтов играет рояль? про порядок вывода ничего не сказано в задаче жеж.
Спасибо.
package com.javarush.task.task18.task1803;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
/*
Самые частые байты
*/
public class Solution {
public static void main(String[] args) throws Exception {
ArrayList<Integer> arrayList = new ArrayList<>();
ArrayList<Integer> shortenedList = new ArrayList<>();
BufferedReader newBR = new BufferedReader(new InputStreamReader(System.in)); //водим в тестовый файл строчку "бу-бу-бу!"
FileInputStream fileName = new FileInputStream(newBR.readLine()); //читаем строчку "бу-бу-бу!" из файла
// добавляем строчку ввиде массива байт в лист: [208, 177, 209, 131, 45, 208, 177, 209, 131, 45, 208, 177, 209, 131, 33]
while (fileName.available() > 0) {
arrayList.add(fileName.read());
}
newBR.close();
fileName.close();
//сортируем массив, используя компаратор и задавая в нем частоту использования байта (нисходящая сортировка)
Collections.sort(arrayList, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (Collections.frequency(arrayList, o1) > Collections.frequency(arrayList, o2)) return -1;
else if (Collections.frequency(arrayList, o1) < Collections.frequency(arrayList, o2)) return 1;
else return 0;
}
});
//в результате получаем отсортированный лист [208, 177, 209, 131, 208, 177, 209, 131, 208, 177, 209, 131, 45, 45, 33]
//где самое первое значение в массиве будет иметь максимальную частоту использования
//Теперь зная максимальную частоту у самого первого байта в массиве
// , можно создать новый массив куда поместить все байты, которые с данной частотой упомянаются в массиве
int mostFreqF = Collections.frequency(arrayList, arrayList.get(0));
for (Integer a : arrayList) {
if (Collections.frequency(arrayList, a) == mostFreqF) shortenedList.add(a);
}
//выведение в консоль в одну строку отобранных байтов с максимальной частотой (с пробелами между ними)
for (int i = 0; i < shortenedList.size(); i += mostFreqF) {
if (i + 2 * mostFreqF > shortenedList.size()) System.out.print(arrayList.get(i)); //условия, чтобы в конце не было пробела
else System.out.print(arrayList.get(i) + " ");
}
//Вывод в консоль: "208 131 209 177"
}
}