1)“四级常用单词.txt”中记录了常用的3000多个单词,请统计该文档中所有英文字母(a-z,可不区分大小写)出现的次数和频率,并将统计结果按照字母出现频率由高到低排序后输出到目标文件“result.txt”中。 2)说明: ①“四级常用单词.txt”的编码方式为UTF-8; ②可用字符流读取,并用数组进行统计; 只统计独立出现的单词
时间: 2024-02-18 16:01:13 浏览: 253
好的,下面是Java代码实现:
```java
import java.io.*;
import java.util.*;
public class CharacterFrequency {
public static void main(String[] args) throws IOException {
// 读取文件内容
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream("四级常用单词.txt"), "UTF-8"));
StringBuilder content = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
content.append(line);
}
reader.close();
// 统计字母出现次数
int[] count = new int[26];
for (int i = 0; i < content.length(); i++) {
char c = content.charAt(i);
if (c >= 'a' && c <= 'z') {
count[c - 'a']++;
} else if (c >= 'A' && c <= 'Z') {
count[c - 'A']++;
}
}
// 计算字母出现频率
double[] frequency = new double[26];
int total = content.length();
for (int i = 0; i < 26; i++) {
frequency[i] = (double)count[i] / total;
}
// 按照字母出现频率由高到低排序
Character[] letters = new Character[26];
for (int i = 0; i < 26; i++) {
letters[i] = (char)(i + 'a');
}
Arrays.sort(letters, new Comparator<Character>() {
@Override
public int compare(Character c1, Character c2) {
return Double.compare(frequency[c2 - 'a'], frequency[c1 - 'a']);
}
});
// 输出结果到文件
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("result.txt"), "UTF-8"));
for (int i = 0; i < 26; i++) {
writer.write(letters[i] + ": " + String.format("%.2f%%", frequency[letters[i] - 'a'] * 100));
writer.newLine();
}
writer.close();
}
}
```
代码解释:
1. 首先,我们使用BufferedReader和InputStreamReader将文件内容读取到字符串中。
2. 接下来,我们创建一个长度为26的整型数组count,用来存储每个字母出现的次数。然后,我们遍历字符串中的每个字符,如果该字符是英文字母,则将对应的数组元素加1。
3. 统计完成后,我们创建一个长度为26的浮点型数组frequency,用来存储每个字母的频率。然后,我们遍历整型数组count,根据每个字母出现的次数计算出对应的频率。
4. 接下来,我们创建一个长度为26的Character数组letters,用来存储所有字母。然后,我们使用Arrays.sort()方法对该数组进行排序,排序时需要传入一个Comparator对象,根据字母出现的频率进行比较。
5. 最后,我们使用BufferedWriter和OutputStreamWriter将结果写入到目标文件中。在写入时,我们需要按照字母出现频率由高到低的顺序输出。
阅读全文