Нужна помощь в реализации метода который возвращает частоту повторяемости всех букв в тексте, игнорируя регистр
public Map<Character, Integer> getFrequencyRepetitionAllLettersText(String way) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new FileReader(way));
Map<Character, Integer> result = new TreeMap<>();
int c;
while((c = bufferedReader.read()) != -1) {
if(!result.containsKey((char)c)) {
result.put((char)c, 1);
} else {
int number = result.get((char)c);
result.put((char)c, number + 1);
}
}
for(Map.Entry<Character, Integer> item : result.entrySet()) {
System.out.println(item.getKey() + " " + item.getValue());
}
bufferedReader.close();
return result;
}
public class DemoStringUtil {
private static String text = "C:\\Users\\User\\IdeaProjects\\untitled\\text.txt";
public static void main(String[] args) throws IOException {
FileUtil fileUtil = new FileUtil();
System.out.println(fileUtil.getFrequencyRepetitionAllLettersText(text));
}
}
Ответы (2 шт):
Автор решения: Nowhere Man
→ Ссылка
Для данной задачи достаточно просто использовать Stream API:
- получить поток строк из текстового файла при помощи
Files.lines - преобразовать каждую строку в поток символов
- отфильтровать буквы
- используя
Collectors.groupingBy+Collectors.summingIntполучить частоту букв, приведя каждую букву в единый регистр
public static Map<Character, Integer> countCharFrequency(String filename) throws IOException {
try (Stream<String> lines = Files.lines(Paths.get(filename))) {
return lines // Stream<String>
.flatMap(String::chars) // IntStream
.mapToObj(c -> (char) c) // Stream<Character>
.filter(Character::isLetter) // отфильтровать буквы
.collect(Collectors.groupingBy(
Character::toLowerCase,
Collectors.summingInt(c -> 1)
));
}
}
Автор решения: Олег
→ Ссылка
public Map<Character, Integer> getFrequencyRepetitionAllLettersText(String way) {
Map<Character, Integer> map = new HashMap<>();
String letters = getListStringFromFile(way).toString().toLowerCase().replaceAll("[^a-z]", "");
for (int i = 0; i < letters.length(); i++) {
map.put(letters.charAt(i), map.getOrDefault(letters.charAt(i), 0) + 1);
}
return map;
}