-
题目描述
编写Java程序统计一篇英文文档中各单词出现的次数,并按单词出现的频率由高到低进行输出。
例如:文档“Hello word Hello”的统计结果为:
Hello:2次
word:1次
思路分析
- 1. 处理文档:先用nextLine()将文段输入,存储在字符串file,再调用split()方法将字符串分割成一个个单词放在一个数组中。
- 关于split()方法:
- 签名为:string.split("character"),其中,string为字符串类型变量实例,character为要设为分割符的字符。
- 连接符:若需要设置多个分割符,则需要用连接符 '|',将多个分割符连接起来。
- 特殊处理:如 ",:,.,\等符号是正则表达式的一部分,需要加反斜杠符"\"进行转义。
- 下面是本题的例子:
-
String file = input.nextLine();//输入文档 String[] words; words = file.split(" |,|\\.|\"");//设置字符串数组元素之间的分隔符, //其中.和"是正则表达式的一部分,需要加进行转义 //通过实践发现两者进行转义的方法不同,分别是加“\\”和“\"
- 2. 用for-each循环遍历数组将各个单词以及频次作为哈希表的条目存入自定义哈希表wordMap。
//for-each循环遍历
for(String word: words) {
if(word == "") continue;//处理空字符
//将所有单词统一转换成小写,防止一个单词因为大小写不同原因被记为两个单词
word = word.toLowerCase();
//该位置哈希值为空值时,赋初始值1
if(wordMap.get(word) == null)
wordMap.put(word, 1);
//哈希表位置不为空时,单词频次加一
else
wordMap.put(word, wordMap.get(word) + 1);
}
3.排序:将Map的条目转换成List列表集合,调用Collection类中的sort方法进行排序。根据哈希值进行排序,需要重写比较器Comparator。
/*进行排序*/
//将Map的条目转换成List列表集合,调用Collection类中的sort方法进行排序
ArrayList<Map.Entry<String, Integer>> wordNumberList = new ArrayList<>(wordMap.entrySet());
//根据值进行排序,需要重写比较器
Collections.sort(wordNumberList, new Comparator<Map.Entry<String, Integer>>(){
@Override
public int compare(Map.Entry<String, Integer> object1, Map.Entry<String, Integer> object2) {
//降序
return object2.getValue() - object1.getValue();
}
});
4.打印结果:设置一个计数器count,每输出5个单词换行。
/*打印结果*/
int count = 0;//计数器
for(Map.Entry<String, Integer> entry: wordNumberList) {
count++;
System.out.print(entry.getKey() + ": " + entry.getValue() + "次 ");
//每5个单词换行显示
if(count % 5 == 0)
System.out.printf("\n");
}
完整代码
import java.util.Scanner;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class WordNumber {
public static void main(String[] args) {
HashMap<String, Integer> wordMap = new HashMap<>();//声明哈希表
Scanner input = new Scanner(System.in);
System.out.println("请输入有一篇英语文档:");
String file = input.nextLine();//输入文档
String[] words;
words = file.split(" |,|\\.|\"");//设置字符串数组元素之间的分隔符,
//其中.和"是正则表达式的一部分,需要加进行转义
//for-each循环遍历 //通过实践发现两者进行转义的方法不同,分别是加“\\”和“\"
for(String word: words) {
if(word == "") continue;//处理空字符
//将所有单词统一转换成小写,防止一个单词因为大小写不同原因被记为两个单词
word = word.toLowerCase();
//该位置哈希值为空值时,赋初始值1
if(wordMap.get(word) == null)
wordMap.put(word, 1);
//哈希表位置不为空时,单词频次加一
else
wordMap.put(word, wordMap.get(word) + 1);
}
/*进行排序*/
//将Map的条目转换成List列表集合,调用Collection类中的sort方法进行排序
ArrayList<Map.Entry<String, Integer>> wordNumberList = new ArrayList<>(wordMap.entrySet());
//根据值进行排序,需要重写比较器
Collections.sort(wordNumberList, new Comparator<Map.Entry<String, Integer>>(){
@Override
public int compare(Map.Entry<String, Integer> object1, Map.Entry<String, Integer> object2) {
//降序
return object2.getValue() - object1.getValue();
}
});
/*打印结果*/
int count = 0;//计数器
for(Map.Entry<String, Integer> entry: wordNumberList) {
count++;
System.out.print(entry.getKey() + ": " + entry.getValue() + "次 ");
//每5个单词换行显示
if(count % 5 == 0)
System.out.printf("\n");
}
}
}
标签:Map,word,wordMap,单词,由高到,哈希,Java,String
From: https://blog.csdn.net/m0_74412436/article/details/136991078