Коллеги, добрый вечер.
Уже 2ю задачу не могу проверить валидатором.
Пишет, что "Программа работала слишком долго и была закрыта!".
В чем может быть косяк?
Ввести с консоли имя файла.
Найти байт или байты с максимальным количеством повторов. Вывести их на экран через пробел. Закрыть поток ввода-вывода.
Требования:
Программа должна считывать имя файла с консоли.
Для чтения из файла используй поток FileInputStream.
В консоль через пробел должны выводиться все байты из файла с максимальным количеством повторов.
Данные в консоль должны выводится в одну строку.
Поток чтения из файла должен быть закрыт.
jgjghhhhhhhjj
0
Комментарии (6)
популярные
новые
старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
39-47 строка, вы посчитали повторяющиеся байты
Что вы делаете с 52 по 56, зачем вы заново пересчитываете количество байт? Попробуйте эту работу оптимизировать, потому что вы делаете её 2 раза
Виктор, логика следующая:
- сначала считаю макс число повторений, потом перебираю еще раз коллекцию, чтобы из неё достать байты, которые повторяются макс число раз в коллекцию list, далее из коллекции list на консоль вывожу по одному экземпляру байтов через пробел.
Верный ли ход мысли? Валидатор не принимает...
Ниже код по данной задаче, который имею на текущий момент:
publicclassSolution{publicstaticvoidmain(String[] args)throwsException{BufferedReader bf =newBufferedReader(newInputStreamReader(System.in));String one = bf.readLine();int count =0;
bf.close();ArrayList<Byte> list =newArrayList<>();ArrayList<Byte> listSort =newArrayList<>();ArrayList<Integer> listCount =newArrayList<>();FileInputStream fis =newFileInputStream(one);while(fis.available()>0){
listSort.add((byte) fis.read());}
fis.close();for(int i =0; i < listSort.size(); i++){for(int j =0; j < listSort.size(); j++){if(listSort.get(i)== listSort.get(j)){
count++;}}
listCount.add(count);
count =0;}int countMax =Collections.max(listCount);for(int i =0; i < listSort.size(); i++){for(int j =0; j < listSort.size(); j++){if(listSort.get(i)== listSort.get(j)){
count++;}}if(count == countMax){
list.add(listSort.get(i));}
count =0;}for(int i =0; i < list.size()-1; i++){if(list.get(i)!= list.get(i +1)){System.out.print(list.get(i)+" ");}if(list.get(i)== list.get(list.size()-1)){System.out.print(list.get(list.size()-1));break;}}}}
Pavel, а Вы сами запускали свою программу? Посмотрите что она выводит =)
while(true){
b =(byte) fis.read();// Вот тут ошибка, получаете переполнениеif(b ==-1)break;// когда приводите к меньшему типу и можете никогда не получить -1
list.add(b);// соответственно не выйдете с цикла}
Метод read() возвращает значение int от 0 до 255, -1 когда нечего больше читать.
Не могу понять Вашу логику...
Collections.sort(list);// отсортировали полученный list по возрастанию (кстати зачем ?)for(byte by : list){
listSort.add(by);// поэлементно? переносите данные с одной коллекции в другую ?}// в результате у Вас две отсортированных одинаковых коллекции
Можете мне по пунктам написать Ваш алгоритм? А то я так и не понял)
Тарас, привет.
Прогу запускал, выводит байты с максимальным количеством повторов, в моем случае это 104, текстовый файл "one" приложен к задаче.
Касательно кода:
while(true){
b =(byte) fis.read();// Вот тут ошибка, получаете переполнениеif(b ==-1)break;// когда приводите к меньшему типу и можете никогда не получить -1
list.add(b);// соответственно не выйдете с цикла}
1я задача на нахождение максимального байта почему-то прошла, используя данный подход по чтению файла. Какое тогда возможно решение, чтобы не было переполнения?
Странно, я думал, что значение -1 это значит, что "данные в файле все прочитаны" и значение -1 получится в итоге в любом случае. Есть мысль как эту проблему решить
?
Второй кусок кода, где я сортирую массив не смотрите, здесь я затупил, можно обойтись без сортировки.
1-я задача, скорей всего прошла, так как попался байт со значением 255, что после приведения типа обрезало результат и он стал -1.
while(fis.available()>0){
list.add(fis.read());}/*Вот такой вариант предпочтительней (Пока в файле есть не прочитанные байты)*//*Ну иди твой вариант, только без приведения типа*/int b;while(true){
b = fis.read();if(b ==-1)break;
list.add((byte) b);// вот тут можно привести тип к байту/*при этом значение меняется int 255 == byte -1 int 254 == byte -2...*/}
P. S. Я сам не могу понять как программа правильно понимает разницу между считанными данными:
- Когда читаем read(один byte) получаем значение типа int от 0..255
- Когда читаем read(массив byte[]) получаем значение типа int, которое означает количество прочитанных байт. А сами прочитанные байты будут храниться в том массиве, но их значение теперь от -128..127
Кто мне объяснит? )))