Как преобразовать текстовый файл в нижний регистр и найти частоты букв? - PullRequest
1 голос
/ 28 мая 2020

Я пишу код, который читает текстовый файл и выводит частоту букв. Я использовал метод FileInputStream для чтения файла и понятия не имею, как преобразовать верхний регистр в нижний регистр.

Код запускается, но читаются только строчные буквы. Как исправить проблему?

Ответы [ 3 ]

0 голосов
/ 28 мая 2020

Если вам разрешено использовать Java 8 потоков и такие «новые» объекты ввода-вывода, как Files и Path, вы можете выполнить эту задачу довольно просто:

Map<Character, Long> freq = Files.lines(Path.of(filepath))        // get stream of file lines
                .flatMap(s -> s.chars().mapToObj(c -> (char) c))  // convert each line into stream of characters
                .collect(
                    Collectors.groupingBy(Function.identity(),    // group by each character
                    Collectors.counting()));                      // count characters in the stream

Если вам нужно только считать буквы, их можно дополнительно отфильтровать:

Map<Character, Long> letterFreq = Files.lines(Path.of(filepath))
                .flatMap(s -> s.chars().mapToObj(c -> (char) c))
                .filter(Character::isLetter)
                .collect(
                    Collectors.groupingBy(Function.identity(), Collectors.counting()));
0 голосов
/ 29 мая 2020

Ваша программа работает достаточно хорошо. Чтобы преобразовать в нижний регистр, см. Следующее:

while ((d = fileInputStream.read()) != -1) {
    d = Character.toLowerCase(d); // <-- add this line here
    char ch = 'a';
    for (int i = 0; i < 26; i++) {

       if (d == ch) {               
           f[i] = f[i] + 1;
       }
       ch++;
    }
}

Еще пара предложений.

  • поместите блок catch в конец вашего try блока.
} catch (IOException e) {
    e.printStackTrace();
}
  • И когда вы распечатываете символы, игнорируйте те, с нулевым счетчиком, чтобы ваш счетчик частоты был более читабельным.

  • И примитивное число массивы инициализируются нулевыми значениями, поэтому вам не нужно этого делать.

0 голосов
/ 28 мая 2020

Это решение не преобразует верхний регистр в нижний, но может помочь вам решить вашу проблему.

Поскольку значения char берутся из таблицы ASCII, вы можете сделать второй l oop следующим образом:

char ch = 'A';

for(int i=0; i<26; i++){
    if(d==ch) {
        f[i] += 1;
    }
    ch++;
}

или вы можете изменить свое условие в своем for l oop с помощью:

if(d==ch || d==(ch-32))

Вы можете проверить таблицу ascii здесь: https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html

...