Встречаемость символов

  • 20
  • Недоступна
Программа запускается с одним параметром - именем файла, который содержит английский текст. Посчитать частоту встречания каждого символа. Отсортировать результат по возрастанию кода ASCII (почитать в инете). Пример: ','=44, 's'=115, 't'=116. Вывести на консоль отсортированный результат: [символ1] ча
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (308)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Vad18 уровень
an hour ago
Решил посмотреть, что получится на простейшем функционале: import java.io.*; public class Solution { public static void main(String[] args) throws Exception { FileInputStream file = new FileInputStream(args[0]); byte[] ch = new byte[file.available()]; if (file.available() > 0) file.read(ch); file.close(); int[] count = new int [128]; for(int i=0;i<128;i++){ for(int b : ch) if(i==b) count[i]++; } for(int i=0;i<128;i++){ if(count[i]>0) System.out.println( (char)i+" "+count[i]); } } } Кажется ни к чему здесь грузить систему всякими крутыми наворотами.))) PS: Если перебор делать от 32, а не от 0, валидатор пишет, что символы не отсортированы по возрастанию.
Alexey Tsutsoev18 уровень, Таганрог
вчера, 16:23
Усложни себе жизнь сам. Задача за 5 минут решается через TreeMap, данная структура данных автоматически отсортирует Вам ключи по коду ASCII. Если кому надо, то порядок действий: 1) Создаем необходимый FileInputStream с нужным параметром, создаем ArrayList, создем TreeMap. 2) считываем поток и в том же цикле добавляем его в ArrayList. 3) проходимся по arrayList с помощью for each. В нём создаем переменную-счётчик, которая count=Collections.frequency(dataArray, i); В этом же цикле добавляем в нашу мапу значения: dataMap.put((char) i, count); 4) следующим for each выводим значения в консоль. И самое обидное: код, описанный выше написал за 5 минут, никаких проблем. Но мой мозг почему-то решил, что сортировать надо не по ASCII, а по частоте повторений. И битый час искал способ отсротировать TreeMap по значению, а не по ключу. Да, такого способа не существует.
вчера, 10:00
Объём данных мал и предсказуем. Логично использовать тут int[128] с последующим выводом ненулевых элементов. Тренировку с коллекциями здесь считаю неуместной.
Андрей19 уровень, Москва
Saturday, 10:17
Для себя сразу увидел решение через Map, но т. к. было интуитивно, потребовалось несколько проверок,. Алгоритм проверки был следующий: 1. Создал TreeMap и накидал в нее различных символов 2. Создал массив этих же символов и проверил их байт-коды 3. Вывел в консоль Map и убедился в правильности сортировки Поняв что интуиция не подвела перешел к решению. Алгоритм решения: 1. Считываю из файл в массив все байты 2. Прохожу по массиву байт: 2.1. если символ уже есть в Map к значению прибавляю +1 - if (countChars.containsKey((char) b)) countChars.replace((char)b, countChars.get(Character.valueOf((char)b)) + 1); 2.2. если нет записываю в Map со значением 1 3. Вывожу в консоль Ключ - Значение из Map
Дмитрий Панфилов20 уровень, Москва
Thursday, 21:53
Расширенную табличку с 255 кодами валидатор принял :)
Александр 19 уровень, Екатеринбург
Thursday, 15:33
Мало вероятно, но вдруг кто-то так же как я не знал или забыл:
System.out.println((char)65); //будет А
System.out.println( (int)'A' ); //будет 65
SOLOM0N20 уровень
8 May, 18:23
Создал массив int[] count длиной 126. Каждая ячейка массива соответствует коду ASCII. Читаем символ из файла и увеличиваем соответствующую ячейку массива. Чтение из файла делал через буфер для увеличения скорости работы программы. В конце выводим данные из массива в цикле, если значение ячейки не 0.
Kalinka18 уровень, Москва
12 May, 15:35
Да, у меня аналогичное решение. Только массив длиной 128 - если посмотреть таблицу ASCII, то там коды от 0 до 127. Но сначала не обратила внимания на то, что можно воспользоваться обычным массивом и делала через HashMap. Всё отлично работало, только код получился тяжелым и валидатору что-то не понравилось :)
Александр 19 уровень, Екатеринбург
Thursday, 15:08
Очень элегантное решение. Спасибо.
Андрей19 уровень, Минск
7 May, 17:37
А я вообще не создавал ни коллекций, ни массива лишнего... Валидатор принял. Считал файл в буфер byte[] buffer. Закрыл поток. Переменная-счетчик. А потом просто вложенный цикл. Внешний for i от 0 до 126 (валидатор принял именно от 0, хотя до 32 вроде как непечатные символы) - это уже готовая сортировка. А во вложенном foreach сравниваем байты buffer с текущим i и увеличиваем счетчик. Закрываем вложенный цикл, и печатаем результат, если счетчик не нулевой. Обнуляем счетчик.
Владимир23 уровень
1 May, 12:46
Валидатор не перестает удивлять.
Артём Кравченко20 уровень, Таганрог
26 April, 09:51
Для будущих поколений - выводить нужно только те символы, которые встречаются в файле Я же долго бился, не понимая, что не нравится валидатору, выводя такой список: a 0 b 3 c 0 d 4