Подсчет запятых

  • 10
  • Недоступна
С консоли считать имя файла. Посчитать в файле количество символов ',', количество вывести на консоль. Закрыть потоки. Подсказка: нужно сравнивать с ascii-кодом символа ','.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (154)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
milyasow
Уровень 30, Москва, Russian Federation
1 июня, 10:13
Можно сравнить и с Character.valueOf(',')
Евгений
Уровень 24, Санкт-Петербург, Russian Federation
31 марта, 14:00
кроме названии переменных отличился оберткой в трай-кеч
Александр Горохов
Уровень 23, Дятьково, Россия
19 ноября 2021, 07:51
Решил точь в точь, как в правильном решении, только имя счетчика другое)
Валерий Backend Developer в Mriya Resort&Spa
14 ноября 2021, 14:23
Вспомнил прошлый опыт задач JavaRush, поэтому сразу полез искать код запятой в интернете. Код нашел, задачу решил через обычное сравнение. Посмотрел готове решение не удивился, Когда увидел в коде сравнение на 44
Sergey Kornilov
Уровень 38, Petropavlovsk, Казахстан
9 ноября 2021, 12:00
Всего эту задачу решили 24478 учеников.
Zheleznyak Maxim
Уровень 40, Moscow, Россия
14 октября 2021, 10:20
после этой задачи чувствуешь себя не совсем тупым
Сергей
Уровень 50, Кандалакша, Россия
12 октября 2021, 11:01
Оно и так сработало...
if (inputStream.read() == ',') counter++;
Harsiyanin
Уровень 18, Назрань, Россия
9 января, 12:34
Из уверенности, что так уж точно не сработает, полез в комменты искать ссылки на материал...
qdeyar Backend Developer
3 октября 2021, 17:46
char z = ','; if (x == (int)z) count++; 😉
Hugon
Уровень 29, Москва, Россия
21 марта, 17:55
если мы приведем символ из char в int, то число будет соответствовать таблице ASCII ?! понял))
artinsky
Уровень 20, Киев, Украина
1 октября 2021, 21:30
Копался с задачей два дня. И получал от валидатора таймаут. Почитал комментарии. Получилось вот что. Код, который не проходит по таймауту выглядит так:
while ((data = fs.read()) != -1) {if (data == comma) {counter++;}
}
а работоспособный с точки зрения валидатора, так:
while (fs.available() > 0) {if (fs.read() == comma){counter++;}
}
Нашёл у Хорстманна такое описание: "..Как методы read(), так и методы write() блокируют доступ до тех пор, пока все байты не будут фактически считаны или записаны. Это означает, что если потоку ввода-вывода не удается получить доступ немедленно (что обычно случается из-за занятости сетевого соединения), происходит блокирование текущего потока исполнения" Из чего я делаю вывод, что авторы задачи могли решить: "А давай-ка мы файл, в котором хотим подсчитать запятые, заблокируем, чтобы поток чтения не мог получить к нему доступ?" Тогда обращение за чтением без предварительной проверки состояния ридера (available) приведет к подвешиванию потока.. То есть, с той стороны может быть 2 файла в качестве теста: один свободный, второй заблокированный. Соответственно, но втором поток повиснет.
Serg
Уровень 36, Санкт-Петербург
10 октября 2021, 14:45
А почему вы не пользуетесь подсказкой: import java.io.BufferedReader; Объявляем ридер, причем я его использовал как и для получения названия файла, так и для подсчета. while(reader.ready()) { if(reader.read()==44) count++; } Потом выводим в консоль count и все. 44 код запятой в ANSII
artinsky
Уровень 20, Киев, Украина
11 октября 2021, 20:25
В условии сказано использовать FileInputStream, поэтому даже в голову не пришло посмотреть на BufferedReader. Но, спасибо) Для меня было ценно понять принцип работы с блокировкой потока. А вот искать ASCII код запятой было лень. Я думаю, нагляднее так:
byte comma = ',';
Павел Рязанов
Уровень 35, Казань, Russian Federation
11 января, 06:55
Как мне кажется, в первом варианте у вас ошибка в блоке while. Поток читает байт. При read() байт в переводе в int принимает значение от 0 до 255. поэтому формулировка while ((data = fs.read()) != -1) всегда будет истина, программа не сможет завершиться. Так как валидатор не может завершить программу, он отвечает вам, что превышено время ожидания.
KingKazma
Уровень 36
16 января, 15:24
он будет возвращать значения в диапазоне до тех пор пока есть что возвращать, как только поток будет пуст он вернет "-1", технически условие рабочее, встречал его много раз)
SWK
Уровень 16
15 апреля, 14:40
Вчера 14.04.2022, т.е. через полгода с момента публикации исходного сообщения, администрация пообещала мне, что вариант ((data = fs.read()) != -1) будут принимать наравне с (fs.available() > 0). Правда, неизвестно, когда будет. Правда, вопрос касался нескольких предыдущих задач. Правда, юридического соглашения с администрацией мы не заключали... Сообщение про таймаут от валидатора обескуражило администрацию на несколько дней. Т.е., о багтрекерах не все в курсе...
Roman
Уровень 26
1 октября 2021, 07:43
Почему такой код не работает? if ((byte)inputStream.read() == 00101100)
artinsky
Уровень 20, Киев, Украина
12 октября 2021, 07:03
потому, что такая запись не воспринимается компилятором как двоичное представление числа. пример
byte data = 0b00101100;
где, 0b или 0B - двоичный литерал