统计文章使用的汉字数并且计算出每个字重复使用的次数

本文介绍了一个Java程序,用于统计文本文件中每个汉字出现的频率,并按照频率从高到低排序输出。程序通过读取指定文件,识别并记录每个汉字及其出现次数。
直接看代码

有三个类,ChineseEntity汉字的对象包括汉字和每个汉字的重复次数,MyComparator为了数组的排序 Test111 这个是主类

先看主类Test111

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Test111 {

/**
* @param args
*/
public static void main(String[] args) throws Exception {
Map<String, String> chineseMap = new HashMap<String, String>();
ArrayList<ChineseEntity> arrayList = new ArrayList<ChineseEntity>();
String filePath = "/Users/alecyan/Downloads/37a60a51236722724f8e863791988205/[历史]《历史是个什么玩意儿》1.2.3.txt";
File file = new File(filePath);
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(
file));
BufferedReader reader = new BufferedReader(new InputStreamReader(fis,
"gb2312"), 5 * 1024 * 1024);
String line = null;

while ((line = reader.readLine()) != null) {
for (int i = 0; i < line.length(); i++) {
int chr1 = (char) line.charAt(i);
if (chr1 >= 19968 && chr1 <= 171941) {// 汉字范围 \u4e00-\u9fa5 (中文)
String newStr = Character.toString(line.charAt(i));
String value = chineseMap.get(newStr);
if (value == null) {
chineseMap.put(newStr, "1");
} else {
int iCount = Integer.parseInt(value);
iCount = iCount + 1;
chineseMap.put(newStr, new Integer(iCount).toString());
}
}
}
}
Set<String> keySet = chineseMap.keySet();
if (keySet != null && keySet.size() > 0) {
for (String key : keySet) {
if (chineseMap.get(key) != null) {
int iCount = Integer.parseInt(chineseMap.get(key));
ChineseEntity chineseEntity = new ChineseEntity();
chineseEntity.setChineseStr(key);
chineseEntity.setiCount(iCount);
arrayList.add(chineseEntity);
}
}
}
Object[] chineseEntityArray = arrayList.toArray();
java.util.Arrays.sort(chineseEntityArray, new MyComparator());
if (chineseEntityArray != null && chineseEntityArray.length > 0) {
System.out.println("total chinese character:" + chineseEntityArray.length);
for (int i = 0; i < chineseEntityArray.length; i++) {
ChineseEntity chineseEntity = (ChineseEntity) chineseEntityArray[i];
System.out.println(chineseEntity.getChineseStr() + "---重复次数---"
+ chineseEntity.getiCount());
}
}
}
}



类ChineseEntity
public class ChineseEntity{
private String chineseStr;
private int iCount;
public String getChineseStr() {
return chineseStr;
}
public void setChineseStr(String chineseStr) {
this.chineseStr = chineseStr;
}
public int getiCount() {
return iCount;
}
public void setiCount(int iCount) {
this.iCount = iCount;
}
}

类MyComparator
import java.util.Comparator;

public class MyComparator implements Comparator<Object> {
public int compare(Object obj1, Object obj2) {
ChineseEntity u1 = (ChineseEntity) obj1;
ChineseEntity u2 = (ChineseEntity) obj2;
if (u1.getiCount() > u2.getiCount()) {
return -1;
} else if (u1.getiCount() < u2.getiCount()) {
return 1;
} else {
// 利用String自身的排序方法。
// 如果使用次数相同就按字符串进行排序
return u1.getChineseStr().compareTo(u2.getChineseStr());
}

}
}


这里我们统计了一本电子书,下面是运行的部分结果

total chinese character:3485
,---重复次数---18034
的---重复次数---7939
是---重复次数---5017
一---重复次数---3663
了---重复次数---3656
不---重复次数---3198
国---重复次数---3072
就---重复次数---2710
人---重复次数---2632
这---重复次数---2325
个---重复次数---2295
有---重复次数---1954
大---重复次数---1720
上---重复次数---1699
中---重复次数---1693
他---重复次数---1685
在---重复次数---1581
你---重复次数---1580
来---重复次数---1481
以---重复次数---1402
我---重复次数---1370
都---重复次数---1360
为---重复次数---1356
后---重复次数---1224
子---重复次数---1145
天---重复次数---1124
朝---重复次数---1102
时---重复次数---1066
么---重复次数---1041
到---重复次数---1034
说---重复次数---1018
地---重复次数---1004
<think>嗯,用户想实现一个程序,统计一页文中的英文母数、空格数、总数,还有特定符串的次数,还能删除子串。首先,我得拆解这几个需求,然后想怎么用代码实现。 首先,统计英文母。可能需要遍历每个符,判断是否是母。比如在Python里,可以用isalpha()方法。不过要注意区分大小写吗?用户没说,可能默认都算进去,所以不管大写小写都统计。 然后是空格数,这个简单,直接统计符中的空格数量。总数的话,可能指的是所有符的总数,包括标点、空格等等?或者用户可能指的是单词数?但根据问题描述,总数应该是指所有符的数量,比如符串的长度。比如用户输入一段文,用len()函数就能得到总数。 接下来是特定符串的次数和位置。这需要用到符串的查找功能,比如Python中的find()或者正则表达式。可能需要循环查找,记录每次现的起始位置,直到找完全部。比如,每次找到后,记录位置,然后从下一个位置继续查找。 删除子串功能,可以用符串的replace方法,但需要注意可能只删除指定现的次数,或者全部替换。用户可能需要删除所有现的子串,所以直接替换成空符串就行? 然后要考虑程序的结构。可能把这些功能封装成函数,比如count_letters_spaces,count_total_chars,find_substring_occurrences,delete_substring。每个函数处理一个任务,主程序调用这些函数并输结果。 测试的时候,需要注意各种情况,比如子串重叠的情况,比如在"aaaa"中查找"aa",可能现两次还是三次?比如从索引0开始找到0-1,然后下一次从索引1开始找,得到1-2,这样两次。但如果是允许重叠的话,可能需要不同的处理方式。用户的需求可能是一般的不重叠查找,还是允许重叠?比如在例子中,用户可能需要统计所有可能的次数,包括重叠的情况,所以需要用循环来逐个检查每个可能的起始位置。 比如,查找子串的时候,可以用一个循环,从索引0开始,每次找到后,把起始位置移到当前找到的位置加1,避免重复计算。或者如果是允许重叠的话,就移动到当前起始位置加1,而不是子串长度。比如,符串"ABABA",子串"ABA",第一次在0-2,第二次在2-4,所以现两次。这时候可能需要用起始位置逐步+1的方式来查找。 另外,关于统计数,用户可能指的是中文符和英文符的总和?比如,如果文中有中文,每个汉字算一个,英文母和空格也算。但如果是纯英文的话,总数就是符总数。但用户的问题描述里提到的是“一页文中的英文母数、空格数、总数”,可能总数包括所有符,包括母、空格、标点等。所以总数可以直接用len(text)来统计。 关于存储方式,用户之前的引用提到符串的两种存储方式,顺序和链接。但这里用Python的话,符串是不可变的,所以每次操作都会生成新的符串。比如删除子串的时候,用replace方法生成新符串。 可能的步骤: 1. 输入文本。 2. 统计英文母数:遍历每个符,统计isalpha()为True的数量。 3. 统计空格数:count(' ')。 4. 总数:len(text)。 5. 查找特定符串的次数和位置:循环查找,记录每次的起始索引。 6. 删除子串:用replace方法替换成空符串。 测试案例:比如输入文本"Hello world! Hello Python.",统计母数应为22(H e l l o w o r l d H e l l o P y t h o n,共22个母),空格数3,总数可能是24(包括标点符号)。查找"Hello"现2次,位置0和12。删除后变成" world! Python."。 但需要注意,比如大小写是否敏感,用户可能需要区分大小写,所以在查找的时候要精确匹配。 然后,代码的大致结构: def count_letters(text): return sum(1 for c in text if c.isalpha()) def count_spaces(text): return text.count(' ') def count_total_chars(text): return len(text) def find_substring(text, substring): occurrences = [] start = 0 while start < len(text): pos = text.find(substring, start) if pos == -1: break occurrences.append(pos) start = pos + 1 # 允许重叠的话,start = pos + 1;不允许的话,start = pos + len(substring) return occurrences def delete_substring(text, substring): return text.replace(substring, '') 然后主程序里调用这些函数,并输结果。需要注意,删除子串可能需要用户选择是否删除所有现或者特定次数,但根据问题描述,用户可能希望删除所有现,所以直接replace。 另外,用户可能希望将功能整合到一个程序中,比如输入文本后,显示各个统计结果,然后输入要查找的子串,显示次数和位置,再输入要删除的子串,返回处理后的文本。 可能的实现: text = input("请输入文本:") print(f"英文母数:{count_letters(text)}") print(f"空格数:{count_spaces(text)}") print(f"总数:{count_total_chars(text)}") sub = input("请输入要查找的子串:") occurrences = find_substring(text, sub) print(f"次数:{len(occurrences)},位置:{occurrences}") del_sub = input("请输入要删除的子串:") new_text = delete_substring(text, del_sub) print("删除后的文本:", new_text) 这样就能完成用户的需求。但需要考虑是否有性能问题,比如大文本的处理。不过用户提到的是“一页文”,所以数据量不大,应该没问题。 可能的问题:比如在查找子串时,如果子串为空,如何处理?需要添加输入验证。或者用户输入无效的情况,但根据问题描述,可能不需要处理这些,假设用户输入正确。 另外,统计英文母是否包括大小写,比如isalpha()在Python中对中文会返回False,所以如果文本中有中文,不会被计入母数,这符合用户的需求,因为用户要统计的是英文母。 总结:函数分模块,统计各数值,查找子串位置,替换删除。这样应该能满足用户的需求。</think>根据需求,我们可以分步骤实现文统计符串操作功能。以下以Python为例进行实现: ### 一、基础统计功能实现 ```python def text_statistics(text): # 统计英文母(区分大小写) letter_count = sum(1 for c in text if c.isalpha()) # 统计空格 space_count = text.count(' ') # 统计数(包含所有符) total_count = len(text) return letter_count, space_count, total_count text = "Hello World! This is a test string." letters, spaces, total = text_statistics(text) print(f"母数:{letters} 空格数:{spaces} 总数:{total}") ``` ### 二、符串查找功能实现 ```python def find_substrings(text, pattern): positions = [] start = 0 while start <= len(text): index = text.find(pattern, start) if index == -1: break positions.append(index) start = index + 1 # 支持重叠匹配 return positions positions = find_substrings("ababaabab", "ab") print(f"'ab'现位置:{positions}") # 输:[0, 2, 5, 7] ``` ### 三、子串删除功能实现 ```python def delete_substring(text, pattern): return text.replace(pattern, '') original = "This is an example text" modified = delete_substring(original, "example ") print(modified) # 输:"This is an text" ``` ### 四、功能整合 ```python def text_processor(): text = input("请输入文本:") # 基础统计 letters, spaces, total = text_statistics(text) print(f"\n统计结果:\n母数:{letters}\n空格数:{spaces}\n总数:{total}") # 符串查找 pattern = input("\n请输入要查找的子串:") positions = find_substrings(text, pattern) print(f"次数:{len(positions)}次\n位置索引:{positions}") # 子串删除 del_pattern = input("\n请输入要删除的子串:") new_text = delete_substring(text, del_pattern) print("\n处理后的文本:\n" + new_text) text_processor() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值