我正在写一个代码,读取一个文本文件并输出字母的频率。我使用了一个 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~pattis15-1XXcommonhandoutsascii.html
如果你被允许使用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()));
你的程序工作得相当好。 要转换为小写字母,请看下面的内容。
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的,所以你不需要这样做。