Написать программу, которая будет принимать в качестве аргумента имя текстового файла, и выводить 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
.