Java 代码分析:统计文本中出现频率最高的 10 个大写字母开头的字符串

这段代码实现了从文本文件中读取内容,并统计其中出现频率最高的 10 个大写字母开头的字符串的功能。

代码分析

  1. StringOperation

    • split(String s) 方法:将字符串 s 按空格分割,并返回分割后的字符串数组。
    • eraseMeaninglessWord(String s) 方法:去除字符串 s 中的无意义词语,例如 Mr.Mrs. 等。
    • firstCharIsCaptal(String s) 方法:判断字符串 s 的首字母是否为大写字母。
    • capitalCharStringArray(String[] s) 方法:提取字符串数组 s 中所有大写字母开头的字符串,并返回一个新的字符串数组。
    • bubbleSort(Name[] names) 方法:使用冒泡排序算法对 Name 对象数组 names 进行排序。
  2. FileOperation

    • readFromFile(File f) 方法:从文件 f 中读取内容,并返回一个字符串。
    • writeToFile(File f, String[] s) 方法:将字符串数组 s 写入文件 f
  3. Name

    • 该类表示一个名字,包含 namecount 属性,分别表示名字和出现的次数。
  4. 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;
}

代码优化

  1. 使用更简洁的语法

    • 使用 for 循环替换 while 循环。
    • 使用 += 运算符简化代码。
  2. 优化 bubbleSort 方法

    • 使用更快的排序算法,例如快速排序或归并排序。
  3. 提高代码可读性

    • 使用有意义的变量名。
    • 添加注释解释代码逻辑。

总结

通过以上分析,我们解决了代码中的错误,并对代码进行了优化,使其更易于理解和维护。

代码示例(优化后的代码)

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);
    }
}
Java 代码分析:统计文本中出现频率最高的 10 个大写字母开头的字符串

原文地址: https://www.cveoy.top/t/topic/oEvt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录