我如何将文本文件转换为小写并查找字母的频率?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何将文本文件转换为小写并查找字母的频率?相关的知识,希望对你有一定的参考价值。

我正在编写一个读取文本文件并输出字母频率的代码。我使用FileInputStream方法读取文件,但不知道如何将大写转换为小写。

该代码运行,但仅读取小写字母。我该如何解决这个问题?

答案

此解决方案不会将大写转换为小写,但可以帮助您解决问题。

由于char值来自ASCII表,您可以像这样进行第二个循环:

char ch = 'A';

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

或者您可以使用以下命令在for循环中修改条件:

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

您可以在此处查看ascii表:https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html

另一答案

如果被允许使用Java 8流以及诸如文件和路径之类的“新” IO对象,则可以非常简单地完成此任务:

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()));
另一答案

您的程序效果很好。要转换为小写,请参见以下内容:

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++;
    }
}

另外两个建议。

  • try块的末尾放置一个catch块。
} catch (IOException e) {
    e.printStackTrace();
}
  • 当您打印出字符时,请忽略计数为零的字符,以使频率计数更具可读性。

  • 并且原始数字数组被初始化为0,所以您不需要这样做。

以上是关于我如何将文本文件转换为小写并查找字母的频率?的主要内容,如果未能解决你的问题,请参考以下文章

如何将混合字母和数字转换为字母? C ++

c语言编程:编写程序,实现文本文件的复制。从一个文件中逐个字符输出,将其中的小写字母转换成大写字母

如何在 Vim 中将所有文本转换为小写

如何将大写字母转换为小写[重复]

如何遍历字符串并转换为小写?

将所有第一个字母转换为大写,每个单词保持小写