Счетчик частоты слов - Java

import java.io.EOFException;

public interface ICharacterReader {
char GetNextChar() throws EOFException;
void Dispose();
}

import java.io.EOFException;
import java.util.Random;

public class SimpleCharacterReader implements ICharacterReader {
private int m_Pos = 0;

public static final char lf = '\n';

private String m_Content = "It was the best of times, it was the worst of times," + 
lf +
"it was the age of wisdom, it was the age of foolishness," + 
lf +
"it was the epoch of belief, it was the epoch of incredulity," + 
lf +
"it was the season of Light, it was the season of Darkness," + 
lf +
"it was the spring of hope, it was the winter of despair," + 
lf +
"we had everything before us, we had nothing before us," + 
lf +
"countries it was clearer than crystal to the lords of the State" + 
lf +
"preserves of loaves and fishes, that things in general were" + 
lf +
"settled for ever";

Random m_Rnd = new Random();

public char GetNextChar() throws EOFException {

    if (m_Pos >= m_Content.length()) {
        throw new EOFException();
    }

    return m_Content.charAt(m_Pos++);

}

public void Dispose() {
    // do nothing
}
}

По сути, я создал интерфейс под названием ICharacterReader, который получает следующий символ в предложении и выдает исключение, когда больше нет символов. Под ним я создал класс под названием SimpleCharacterReader, который включает в себя список случайных предложений, которые необходимо считать по частоте слова. Однако сейчас я пытаюсь создать отдельный класс, который принимает интерфейс ICharacterReader в качестве аргумента и просто возвращает частоты слов. Я новичок в программировании, поэтому не совсем уверен, что делать здесь, любое простое предложение будет оценено.

1 ответ

Ваша задача может быть выполнена в двух частях:

1. Чтение char данные и объединяя его в String

Просто используйте StringBuilder и добавить char пока вы не получите исключение.

ICharacterReader reader = ...
StringBuilder sb = new StringBuilder();
try{
    while (true) {
        sb.append(reader.GetNextChar());
    }
} catch (EOFException ex) {
}
String stringData = sb.toString();

2. Подсчет словосочетаний

Просто разделите слова с помощью регулярного выражения, а затем просто посчитайте, как часто встречается каждое слово. Вы можете сделать это легко с помощью Stream API:

Map<String, Long> frequencies = Arrays.stream(stringData.split(" +|\n"))
                                      .collect(Collectors.groupingBy(Function.identity(),
                                                                     Collectors.counting()));
Другие вопросы по тегам