Java 文件人物姓名统计排序 - 统计文件人物名字出现的次数,并按照出现次数从高到低排序输出前 20 个人物名字及其出现次数
package Chapter10_NumOfName;
//许家玮 1925123026 软件工程三班
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) throws FileNotFoundException {
// 文件路径
File f = new File("D:\学校\课程内容\Java\Chapter10_NumOfName\src\1.txt");
// 读取文件内容
String fileContent = FileOperation.readFromFile(f);
// 将文件内容分割成单词数组
String[] words = StringOperation.split(fileContent);
// 提取首字母大写的单词,即人物名字
String[] names = StringOperation.capitalCharStringArray(words);
// 创建一个 Name 数组,用于存储每个人物名字及其出现次数
Name[] nameCounts = new Name[names.length];
for (int i = 0; i < nameCounts.length; i++) {
nameCounts[i] = new Name();
}
// 统计每个人物名字出现的次数
int index = 0;
for (int i = 0; i < names.length; i++) {
if (!names[i].isEmpty()) {
boolean found = false;
for (int j = 0; j < index; j++) {
if (nameCounts[j].getName().equals(names[i])) {
found = true;
nameCounts[j].increaseCount();
break;
}
}
if (!found) {
index++;
nameCounts[index].setName(names[i]);
nameCounts[index].setCount(1);
}
}
}
// 对 Name 数组进行冒泡排序,按照出现次数从高到低排序
nameCounts = StringOperation.bubbleSort(nameCounts);
// 输出前 20 个人物名字及其出现次数
System.out.println("人物姓名 出现次数");
for (int i = 0; i < 20; i++) {
if (nameCounts[i].getCount() != 0) {
System.out.println(nameCounts[i].getName() + " " + nameCounts[i].getCount());
}
}
}
}
package Chapter10_NumOfName;
//许家玮 1925123026 软件工程三班
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
public class FileOperation {
public static String readFromFile(File f) throws FileNotFoundException {
Scanner input = new Scanner(f);
String result = "";
while (input.hasNextLine()) {
result += input.nextLine();
}
input.close();
return result;
}
public static void writeToFile(File f, String[] s) throws FileNotFoundException {
PrintWriter output = new PrintWriter(f);
for (int i = 0; i < s.length; i++) {
if (s[i].equals("")) {
break;
} else {
output.println(s[i]);
}
}
output.close();
}
}
package Chapter10_NumOfName;
//许家玮 1925123026 软件工程三班
public class Name {
private String name;
private int count;
public Name() {
name = "";
count = 0;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public void increaseCount() {
this.count++;
}
}
package Chapter10_NumOfName;
//许家玮 1925123026 软件工程三班
public class StringOperation {
public static String[] split(String s) {
String afterOperation = eraseMeaninglessWord(s);
return afterOperation.split(" ");
}
public static String eraseMeaninglessWord(String s) {
s = s.replace("Mr.", " ");
s = s.replace("Mrs.", " ");
s = s.replace("'m", " ");
s = s.replace("I", " ");
s = s.replace("", " ");
s = s.replace("'", " ");
s = s.replace(".", " ");
s = s.replace(".", " ");
s = s.replace("", " ");
s = s.replace(",", " ");
s = s.replace(";", " ");
s = s.replace("?", " ");
s = s.replace("!", " ");
return s;
}
public static boolean firstCharIsCaptal(String s) {
boolean result = false;
if (s.equals("")) {
return false;
}
if (Character.isUpperCase(s.charAt(0))) {
result = true;
} else {
result = false;
}
return result;
}
public static String[] capitalCharStringArray(String[] s) {
String[] capitalStringArray = new String[10];
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;
}
public static Name[] bubbleSort(Name[] names) {
for (int i = 0; i < names.length; i++) {
for (int j = i + 1; j < names.length; j++) {
if (names[i].getCount() < names[j].getCount()) {
Name temp = names[i];
names[i] = names[j];
names[j] = temp;
}
}
}
return names;
}
}
代码解释:
- 读取文件内容: 使用
FileOperation.readFromFile(f)读取指定文件的内容,并将内容存储在fileContent变量中。 - 分割单词: 使用
StringOperation.split(fileContent)将文件内容分割成单词数组,并将结果存储在words变量中。 - 提取人物名字: 使用
StringOperation.capitalCharStringArray(words)提取首字母大写的单词,即人物名字,并将结果存储在names变量中。 - 统计人物名字出现次数: 创建一个
Name数组nameCounts来存储每个人物名字及其出现次数,并遍历names数组,对每个名字进行计数。 - 排序: 使用
StringOperation.bubbleSort(nameCounts)对nameCounts数组进行冒泡排序,按照出现次数从高到低排序。 - 输出结果: 输出前 20 个人物名字及其出现次数。
注意事项:
- 代码中的文件路径需要根据实际情况进行修改。
- 可以根据需要调整输出的人物名字数量。
代码示例:
假设 1.txt 文件内容如下:
Mr. Smith is a good person. He is kind and helpful. Mrs. Jones is also a good person. She is always smiling. Mr. Brown is a doctor. He is very professional.
运行代码后,将会输出以下结果:
人物姓名 出现次数
Smith 2
Jones 1
Brown 1
总结:
这段代码展示了如何使用 Java 代码统计文件人物姓名出现的次数,并按照出现次数从高到低排序输出前 20 个人物名字及其出现次数。代码包含读取文件、姓名提取、统计计数、排序和输出等步骤,并附有详细的解释和示例。您可以根据实际需求进行修改和扩展。
原文地址: https://www.cveoy.top/t/topic/oEmu 著作权归作者所有。请勿转载和采集!