Самые частые байты

  • 20
  • Недоступна
Ввести с консоли имя файла. Найти байт или байты с максимальным количеством повторов. Вывести их на экран через пробел. Закрыть поток ввода-вывода.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (619)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Andrey Dudin
Уровень 28
вчера, 16:10
Правильное решение оригинальное, мне нравится, сам решил через запись в массив, и сравниванием с самим собой искал максимальное количество совпадений, и добавлял его в массив, если были еще совпадения так же добавлял в него, короче для тех кто так же как я любят копаться в чужих решениях оставлю тут
List<Integer> byteList = new ArrayList<Integer>();
List<Integer> resultByte = new ArrayList<Integer>();
try (FileInputStream inputStream = new FileInputStream(fileName)) {
    while (inputStream.available() > 0) {
        byteList.add(inputStream.read());
    }
}
int maxCount = 0;
int tempCount = 0;
for (int list : byteList) {
    for (int list1 : byteList) {
        if (list == list1)
            tempCount++;
    }
    if (tempCount > maxCount) {
        maxCount = tempCount;
        resultByte.clear();
        resultByte.add(list);
    } else if (tempCount == maxCount && !resultByte.contains(list))
        resultByte.add(list);
    tempCount = 0;
}
resultByte.forEach(d -> System.out.print(d + " "));
Alexey
Уровень 15
27 ноября, 16:21
15 минут на решение через HashMap и полчаса на осмысление правильного решения) Что ж, возьмем на вооружение:)
Серега Батенин
Уровень 30
28 ноября, 19:41
была мысля сделать также как указано в правильном решение. Возможно в рамках именно этой задачи где известно точное максимальное количество элементов и оно в принципе не такое большое, можно было сделать как и у них)) Но в итоге решил сделать тоже через мапу)
Benjam1nBTN
Уровень 21
27 ноября, 10:03
Час писанины кода, и правильно с первой попытки?! ЧООО?!
6AP6AgOC Убираю в Подвале
21 ноября, 20:18
10 попыток, ИТОГО: 1) для чтения из файла используй поток FileInputStream. 2) в main считать имя файла с консоли. 3) найти максимально встречаемый байт, но их может быть несколько, допустим в файле 50 раз встречаются символы - A N B S, нужно вывести каждый из них 1 раз. Выводим в консоль в одну строку через пробел. 5) Поток чтения из файла должен быть закрыт.
6AP6AgOC Убираю в Подвале
21 ноября, 20:03
Вывести их на экран через пробел. // вот тут косяк, вывести только повторяющийся байт или байты, в единичном экземпляре или вывести их столько, сколько их в файле? А если их шт 500 их все нужно выводить? Вот это задачка. )))) Требования: • В консоль через пробел должны выводиться все байты из файла с максимальным количеством повторов. • Данные в консоль должны выводится в одну строку. // Еще раз настоятельно рекомендуют выводить все байты из файла с максимальным количеством повторов, т.е. мы должны вывести каждый байт, который встречается, максимально раз в файле. Если наш байт встречается 1000 раз, мы должны его вывести 1000 раз. ))) Но, валидатор начинает ругаться, ))) не нужно выводить байты, которые уже выведены. ))) твою ж 245ь это просто P5324Ц, божественно. )))
Серега Батенин
Уровень 30
28 ноября, 19:43
500 штук не может быть по определению)) максимальный размер байта 255) Помоему условие предельно простое и ясное)
6AP6AgOC Убираю в Подвале
28 ноября, 20:00
Если бы я читал это через месяц, то уже наверное забыл бы, но))) вы правы, условие действительно предельно простое. Читаем. ))
Ввести с консоли имя файла.
Найти байт или байты с максимальным количеством повторов.
Вывести их на экран через пробел.
Закрыть поток ввода-вывода.
Тут написано что файл должен содержать менее байта повторов одного байта? ))) Берем текстовый файл и вносим 10000 подряд символ А, потом 20000 подряд символ Б, итого уже 30000 ))) ну и так до конца раскладки. Я нашел 20000 повторящихся байтов байта Б, и условие предельно простое, выведите все байты. )) Я их все вывожу, и оказывается это не правильно. )))
Серега Батенин
Уровень 30
28 ноября, 20:27
Их, то есть байт или байты, которые встретились максимальное количество раз)) Вот ты нашел то что встретилось часто его и покажи)) А вот в задаче на минимальное количество как раз таки не прописано что НЕ учитывать байты которых не было в файле, хотя в целом они полностью удовлетворяют условиям. Их не было значит они встретились 0 раз)
6AP6AgOC Убираю в Подвале
28 ноября, 20:44
После 10-ка попыток я уже понял, что хочет валик, это должно быть интуитивно понятно, а не я должен догадываться, что нужно. ))) А по смыслу кажется, совсем другое. А вот про минимальное кол-во в файле, как раз интуитивно понятно, что должно что-то встретиться, чтобы что-то вывести, в противном случае, ничего и не выведется. ) Но вот если что-то встретилось 2 раза, минимально, можно тоже вывести 2 раза и это будет ошибкой. )))
Leon JlEOH
Уровень 32
17 ноября, 12:53
/* Комментарий удален */
Ильдар
Уровень 20
17 ноября, 05:38
зачем при чтении файла нужно прибавлять единицу? объясните, пожалуйста:(
Benjam1nBTN
Уровень 21
27 ноября, 10:18
Эта строчка
byteCountArray[fileInputStream.read()] += 1;
означает, что определенный элемент массива под номером считанного байта (int'ового значения считанного байта) увеличивается на единицу. Для наглядности, изначально массив выглядит так:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ....]
затем считался байт, и это оказался символ "а", который в int'овом выражении равен 97, тогда на позиции №97 массива прибавится единичка, будет так:
[..., 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, ....]
Юлия
Уровень 29
12 ноября, 13:07
Интересная задача. Решила, написав три метода: 1 метод читал и считал байты и заносил их в hashmap; 2 метод с помощью стрим нашел в мапе байт с максимальным количеством повторов; 3 метод достал из мапы ключи, у которых максимальное значение и поместил в строку итоговую(можно было использовать лист для финального результата конечно). Хотела и третий метод реализовать с помощью стримов, но не получилось.
Sidroded Работает в Пивоварне
9 ноября, 16:58
Час смотрю на правильное решение и не могу его понять. Почему используется массив в заданым размером? Тоесть если внутри файла будет больше информации чем 256 байт решение не будет работать? Подскажите пожалуйста
Sidroded Работает в Пивоварне
9 ноября, 23:56
Бляха муха я понял. Они пополняют массив клетки которой соответствуют считанные байты....
Искандер
Уровень 19
3 ноября, 21:40
Решил по-другому, результат правильный, может кому интересно будет, валидатор не пропускает: 1. for создал байтовый массив buffer с помощью метода read(); 2. закрыл сканнер 3. создал TreeMap <Byte, Integer> map 4. циклом for и методом map.put() заполнил в ключ типа Byte от -128 до 127, в значение типа Integer (это будет счетчик, сколько раз встречается) заполнил 0. 5. цикл for по buffer внутренний for цикл по Map.Entry<Byte, Integer>{ if(entry.getKey() == buffer[i]) { Integer newCount = entry.getValue()+1; //счетчик увеличился entry.setValue(newCount); } } 6. перевел map в stream, и методом max() нашёл пару Map.Entry<Byte, Integer> maxEntry 7. вытащил ключ из этой пары maxEntry.getKey() – это самый часто встречающийся байт 8. пробежался for по buffer, и если проходимый элемент равен самому встречающемуся, то выводим в консоль. System.out.print(buffer[i] + " ");
Sidroded Работает в Пивоварне
10 ноября, 00:04
Целый тип без знака — двоичное значение числа без знака (8, 16 или 32 бита). Числовые диапазоны: байт — от 0 до 255; слово — от 0 до 65 535; Считанные данные не могут быть отрицательными. Соответственно вероятно в твоей выборке не было значения с байтами выше 127, по этому ты и получил правильный ответ.
Искандер
Уровень 19
17 ноября, 21:01
я сначала понять не мог что такое байт, вот эта статья помогла. https://javarush.com/groups/posts/630-primitivnihe-tipih-v-java--ne-takie-uzh-oni-i-primitivnihe байт это комбинация 8 цифр ( 0 или 1). Самое первая цифра (старший бит слева) отвечает за знак, если 1, то минус, если 0, то положительное число. А получается из оставшихся 7 цифр образуется диапазон 2 в 7 степени будет 128 возможных комбинаций. А поскольку у нас знак меняется, всего получится 256 комбинаций. Если я не прав, поправьте. Но все таки я думаю, что байты от -128 до 127
Sidroded Работает в Пивоварне
18 ноября, 12:00
Очень рекомендую к прочтению. Спрособы представления и форматы данных. Тема действительно очень важная но увы не раскрывается полноценно на курсе....
Sidroded Работает в Пивоварне
18 ноября, 12:01
Логическая интерпретация основных типов данных Целый тип без знака — двоичное значение числа без знака (8, 16 или 32 бита). Числовые диапазоны: байт — от 0 до 255; слово — от 0 до 65 535; двойное слово — от 0 до 232–1. Целый тип со знаком — двоичное значение числа со знаком (8, 16 или 32 бита). Знак содержится в 7, 15 или 31-м бите соответственно. Отрицательные числа представляются в дополнительном коде. Числовые диапазоны: 8-разрядное целое — от –128 до +127; 16-разрядное целое — от –32 768 до +32 767; 32-разрядное целое — от –231 до +231–1.