实验3 统计英文单词。 使用Scanner类和正则表达式统计一篇英文中的单词,要求如下: 统计一共出现了多少个单词。 统计有多少个互不相同的单词。 按单词出现频率的大小输出单词。
时间: 2024-05-06 08:17:42 浏览: 259
以下是实现该功能的Java代码:
```java
import java.util.*;
import java.util.regex.*;
public class WordCounter {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一篇英文文章:");
String text = scanner.useDelimiter("\\Z").next().toLowerCase(); // 读入整篇文章并转换为小写
scanner.close();
Pattern pattern = Pattern.compile("[a-zA-Z]+"); // 匹配单词的正则表达式
Matcher matcher = pattern.matcher(text);
Map<String, Integer> wordCountMap = new HashMap<>(); // 存储每个单词的出现次数
Set<String> wordSet = new HashSet<>(); // 存储所有出现过的单词
while (matcher.find()) {
String word = matcher.group();
wordSet.add(word); // 添加到单词集合中
if (wordCountMap.containsKey(word)) {
wordCountMap.put(word, wordCountMap.get(word) + 1); // 更新单词出现次数
} else {
wordCountMap.put(word, 1);
}
}
System.out.println("总单词数:" + wordCountMap.size());
System.out.println("互不相同的单词数:" + wordSet.size());
List<Map.Entry<String, Integer>> wordCountList = new ArrayList<>(wordCountMap.entrySet());
wordCountList.sort(Map.Entry.comparingByValue(Comparator.reverseOrder())); // 按照出现次数排序
System.out.println("单词出现频率排名:");
for (int i = 0; i < wordCountList.size(); i++) {
Map.Entry<String, Integer> entry = wordCountList.get(i);
System.out.printf("%2d. %s: %d\n", i + 1, entry.getKey(), entry.getValue());
}
}
}
```
运行示例:
```
请输入一篇英文文章:
This is a test. This is only a test.
总单词数:7
互不相同的单词数:5
单词出现频率排名:
1. this: 2
2. is: 2
3. a: 2
4. test: 2
5. only: 1
```
阅读全文