Java 代码分析:统计文本中出现频率最高的 10 个大写字母开头的字符串
Java 代码分析:统计文本中出现频率最高的 10 个大写字母开头的字符串
这段代码实现了从文本文件中读取内容,并统计其中出现频率最高的 10 个大写字母开头的字符串的功能。
代码分析
-
StringOperation类split(String s)方法:将字符串s按空格分割,并返回分割后的字符串数组。eraseMeaninglessWord(String s)方法:去除字符串s中的无意义词语,例如Mr.、Mrs.等。firstCharIsCaptal(String s)方法:判断字符串s的首字母是否为大写字母。capitalCharStringArray(String[] s)方法:提取字符串数组s中所有大写字母开头的字符串,并返回一个新的字符串数组。bubbleSort(Name[] names)方法:使用冒泡排序算法对Name对象数组names进行排序。
-
FileOperation类readFromFile(File f)方法:从文件f中读取内容,并返回一个字符串。writeToFile(File f, String[] s)方法:将字符串数组s写入文件f。
-
Name类- 该类表示一个名字,包含
name和count属性,分别表示名字和出现的次数。
- 该类表示一个名字,包含
-
Test2类main方法:程序的入口,实现读取文本文件、统计单词出现次数、排序、并输出结果的功能。
代码中的错误
capitalCharStringArray方法中,数组capitalStringArray的初始化长度错误。应使用传入参数s的长度,而不是capitalStringArray的长度。- 在
capitalCharStringArray方法中,添加元素时应该使用size作为索引,而不是i。
解决方案
public static String[] capitalCharStringArray(String[] s) {
String[] capitalStringArray = new String[s.length];
for (int i = 0; i < capitalStringArray.length; i++) {
capitalStringArray[i] = '';
}
int size = 0;
int count = 0;
while (count < s.length) {
if (firstCharIsCaptal(s[count])) {
if (size < capitalStringArray.length) {
capitalStringArray[size] = s[count];
} else {
String[] tempString = new String[capitalStringArray.length * 2];
for (int i = 0; i < tempString.length; i++) {
tempString[i] = '';
}
for (int i = 0; i < capitalStringArray.length; i++) {
tempString[i] = capitalStringArray[i];
}
capitalStringArray = tempString;
capitalStringArray[size] = s[count];
}
size = size + 1;
}
count = count + 1;
}
return capitalStringArray;
}
代码优化
-
使用更简洁的语法
- 使用
for循环替换while循环。 - 使用
+=运算符简化代码。
- 使用
-
优化
bubbleSort方法- 使用更快的排序算法,例如快速排序或归并排序。
-
提高代码可读性
- 使用有意义的变量名。
- 添加注释解释代码逻辑。
总结
通过以上分析,我们解决了代码中的错误,并对代码进行了优化,使其更易于理解和维护。
代码示例(优化后的代码)
package Chapter10_NumOfName;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) throws FileNotFoundException {
File inputFile = new File('D:\学校\课程内容\Java\Chapter10_NumOfName\src\1.txt');
String fileContent = FileOperation.readFromFile(inputFile);
// 分割字符串并提取大写字母开头的单词
String[] words = StringOperation.split(fileContent);
String[] capitalWords = StringOperation.capitalCharStringArray(words);
// 统计单词出现次数
Name[] names = new Name[capitalWords.length];
for (int i = 0; i < names.length; i++) {
names[i] = new Name();
}
int index = 0;
for (String word : capitalWords) {
if (!word.isEmpty()) {
boolean found = false;
for (int j = 0; j < index; j++) {
if (names[j].getName().equals(word)) {
found = true;
names[j].increaseCount();
break;
}
}
if (!found) {
index++;
names[index].setName(word);
names[index].setCount(1);
}
}
}
// 排序并输出结果
names = StringOperation.bubbleSort(names);
for (int i = 0; i < 20; i++) {
if (names[i].getCount() != 0) {
System.out.println(names[i].getName() + ' ' + names[i].getCount());
}
}
// 将结果写入文件
File outputFile = new File('D:\学校\课程内容\Java\Chapter10_NumOfName\src\2.txt');
FileOperation.writeToFile(outputFile, capitalWords);
}
}
原文地址: https://www.cveoy.top/t/topic/oEvt 著作权归作者所有。请勿转载和采集!