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

问题描述 投票:0回答:1

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

代码运行,但只读取了小写字母。我如何纠正这个问题?

java fileinputstream
1个回答
0
投票

这个解决方案不能将大写字母转换为小写字母,但可以帮助你解决你的问题。

由于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~pattis15-1XXcommonhandoutsascii.html


0
投票

如果你被允许使用Java 8流和Files和Path这样的 "新 "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()));

0
投票

你的程序工作得相当好。 要转换为小写字母,请看下面的内容。

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 (IOException e) {
    e.printStackTrace();
}
  • 而当你打印出字符时,忽略那些计数为0的字符,以使你的频数更易读。

  • 而基数数组是初始化为0的,所以你不需要这样做。

© www.soinside.com 2019 - 2024. All rights reserved.