现在需要统计若干段文字(英文)中的单词数量,并且还需统计每个单词出现的次数。
注1:单词之间以空格(1个或多个空格)为间隔。
注2:忽略空行或者空格行。
基本版:
统计时,区分字母大小写,且不删除指定标点符号。
进阶版:
统计前,需要从文字中删除指定标点符号!.,😗?。 注意:所谓的删除,就是用1个空格替换掉相应字符。
统计单词时需要忽略单词的大小写。
输入说明
若干行英文,最后以!!!为结束。
输出说明
单词数量
出现次数排名前10的单词(次数按照降序排序,如果次数相同,则按照键值的字母升序排序)及出现次数。
输入样例1
failure is probably the fortification in your pole
it is like a peek your wallet as the thief when you
are thinking how to spend several hard-won lepta
when you are wondering whether new money it has laid
background because of you then at the heart of the
most lax alert and most low awareness and left it
godsend failed
!!!!!
输出样例1
46
the=4
it=3
you=3
and=2
are=2
is=2
most=2
of=2
when=2
your=2
输入样例2
Failure is probably The fortification in your pole!
It is like a peek your wallet as the thief when You
are thinking how to. spend several hard-won lepta.
when yoU are? wondering whether new money it has laid
background Because of: yOu?, then at the heart of the
Tom say: Who is the best? No one dare to say yes.
most lax alert and! most low awareness and* left it
godsend failed
!!!!!
输出样例2
54
the=5
is=3
it=3
you=3
and=2
are=2
most=2
of=2
say=2
to=2
-
由于单词需要以空格切分出来并且需要跳过换行,所以就可以直接用 in.next() 的方法读入既可以跳过换行又可以以空格分割出来。
-
对于读到的字符串先按照要求利用StringBuffer或者StringBuilder字符串处理类进行去掉指定字符,然后丢入HashMap<String,Integer>容器进行映射,统计这个单词出现的次数。
-
建立一个ArrayList<Map.Entry<String,Integer>>容器,这个动态数组内存放的是Key - value的键值对。将HashMap中所有的键值对放入ArrayList容器中,调用Collection.sort方法对ArrayList进行指定的排序,必须重写Comparator接口的方法。出现次数多的排列在前,次数相同的按照字典序升序排序。
-
输出HashMap容器键值对数目,然后以键值对的方式遍历ArrayList容器,按照要求输出出现次数前十的十个键值对。
-
整个题的核心就是对HashMap键值对的排序,以及ArrayList是如何存储键值对的。最后就是如何遍历排序好的键值对。
import java.util.*;
public class Main {
static String change(String s){
StringBuffer sb = new StringBuffer();
for(int i = 0;i < s.length();i++){
char x = s.charAt(i);
if(x == '!' || x == '.' || x == ',' || x == ':' || x == '?' || x == '*'){
continue;
}
sb.append(x);
}
return sb.toString().toLowerCase();
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
HashMap<String,Integer> m = new HashMap<String,Integer>();
while(true){
String s = cin.next();
if(s.equals("!!!!!")) break;
s = change(s);
if(m.containsKey(s)){
m.put(s,m.get(s)+1);
}
else{
m.put(s,1);
}
}
//ArrayList中放入成对的 k->v 键值对
ArrayList<Map.Entry<String, Integer> > list = new ArrayList<>(m.entrySet());
//排序重写Comparator接口的方法。
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> m1, Map.Entry<String, Integer> m2) {
if(m1.getValue() - m2.getValue() != 0)
return m2.getValue().compareTo(m1.getValue());
else
return m1.getKey().compareTo(m2.getKey());
}
});
System.out.println(m.size());
int cnt = 0;
//以键值对的方式遍历ArrayList容器
for(Map.Entry<String, Integer> x : list){
System.out.println(x.getKey()+"="+x.getValue());
cnt++;
if(cnt >= 10) break;
}
}
}