Java编程使用Scanner类和正则表达式统计一篇英文中的单词,要求如下:从文件中读取英文, 统计一共出现了多少个单词。 统计有多少个互不相同的单词。 按单词出现频率的大小输出单词,频率显示为三位小数
时间: 2024-05-09 10:21:55 浏览: 163
您好,根据您的要求,我可以帮您解答Java编程使用Scanner类和正则表达式统计一篇英文中的单词的问题。
首先,您需要通过Scanner类读取文件中的文本,并将其存储到字符串中。可以使用如下代码:
```
Scanner scanner = new Scanner(new File("file.txt"));
String text = scanner.useDelimiter("\\Z").next();
```
上述代码将读取名为file.txt的文件中的所有文本,将其存储到text字符串中。
接下来,您可以使用正则表达式来分割单词,并将其存储到一个字符串数组中。可以使用如下代码:
```
String[] words = text.split("[^a-zA-Z']+");
```
上述代码将使用正则表达式[^a-zA-Z']+来分割文本,将单词存储到words字符串数组中。该正则表达式匹配所有不是字母和单引号的字符。
接下来,您可以使用HashMap来存储单词出现的次数。可以使用如下代码:
```
HashMap<String, Integer> wordCounts = new HashMap<String, Integer>();
for (String word : words) {
if (wordCounts.containsKey(word)) {
wordCounts.put(word, wordCounts.get(word) + 1);
} else {
wordCounts.put(word, 1);
}
}
```
上述代码将遍历words数组中的所有单词,并将其存储到HashMap中。如果HashMap已经包含该单词,则将其出现次数加1;否则,将该单词添加到HashMap中,并将其出现次数设置为1。
接下来,您可以计算出文本中一共出现了多少个单词,以及有多少个互不相同的单词。可以使用如下代码:
```
int totalWords = 0;
int uniqueWords = 0;
for (Integer count : wordCounts.values()) {
totalWords += count;
if (count == 1) {
uniqueWords++;
}
}
```
上述代码将遍历HashMap中的所有值,并计算出文本中一共出现了多少个单词。同时,如果某个单词出现的次数为1,则将uniqueWords的值加1,表示有一个新的互不相同的单词。
最后,您可以按单词出现频率的大小输出单词,并将频率显示为三位小数。可以使用如下代码:
```
ArrayList<Map.Entry<String, Integer>> sortedWordCounts = new ArrayList<Map.Entry<String, Integer>>(wordCounts.entrySet());
Collections.sort(sortedWordCounts, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> a, Map.Entry<String, Integer> b) {
return b.getValue().compareTo(a.getValue());
}
});
for (Map.Entry<String, Integer> entry : sortedWordCounts) {
double frequency = (double)entry.getValue() / (double)totalWords;
System.out.println(entry.getKey() + " - " + String.format("%.3f", frequency));
}
```
上述代码将把HashMap中的所有键值对(即单词及其出现次数)存储到ArrayList中,并按照出现次数的大小对其进行排序。然后,遍历排序后的ArrayList中的所有键值对,计算出单词出现的频率,并输出单词及其频率。
希望这些代码可以帮到您!
阅读全文