Написать программу, которая будет принимать в качестве аргумента имя текстового файла, и выводить CSV файл с колонками:
- Слово.
- Частота.
- Частота (в %).
CSV файл должен быть упорядочен по убыванию частоты, то есть самые частые слова должны идти в начале. Разделителями слов считать все символы, кроме букв и цифр.
- Использовать класс
java.lang.StringBuilderдля построения слов. - Для чтения из файла удобно использовать
java.io.InputStreamReader, например:
Reader reader = null;
try
{
reader = new InputStreamReader(new FileInputStream("FILE NAME"));
// read the data here
}
catch (IOException e)
{
System.err.println("Error while reading file: " + e.getLocalizedMessage());
}
finally
{
if (null != reader)
{
try
{
reader.close();
}
catch (IOException e)
{
e.printStackTrace(System.err);
}
}
}- Для определения класса символа использовать метод
Character.isLetterOrDigit. - Для хранения статистики в памяти можно использовать одну из реализаций интерфейса
java.util.Set, который должен будет хранить объекты специального класса. Данный класс должен содержать слово и счётчик. В случае использованияjava.util.HashSetкласс также должен реализовать методыequals,hashCode.
Контейнеры стандартной библиотеки расположены в пакете java.util. IO классы (потоки
ввода-вывода) располагаются в пакете java.io.
Основные интерфейсы:
Set– множество без дубликатов и без доступа по индексу.Map– множество пар ключ-значение, где ключи не повторяются.
Их основные реализации:
HashMap,HashSet— реализации на основе функцииhashCode.TreeMap,TreeSet– реализация на основе бинарного дерева. Ключи (элементы) должны реализовывать интерфейсComporable, иначе необходимо передавать в контейнер при его создании объект, реализующий интерфейсComparator. Хранимые в данных контейнерах данные упорядочены. Лучшее время поиска, но большее накладные расходы на вставку, чем на основе функцииhashCode.