Нужна помощь в реализации метода который возвращает частоту повторяемости всех букв в тексте, игнорируя регистр

 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;
}
→ Ссылка