题目:
编写一个程序,从键盘读入一段英文(多行),找出其中所有的英文单词,统计每个单词出现的次数,并按照单词出现次数由大到小排序后输出。
前言:
“统计每个单词出现的次数,并且按照由大到小排序输出”,根据此特征,我们很容易想到可以用hashMap来解决,其次另外一个难点是如何实现多行输入,老师说是允许先定义输入的行数,这里我们提升点难度,在不需要知道输入行数的情况下实现
相关知识链接:
1.map.containsKey方法的运用
2.面试经常问HashMap,基本用法及四种遍历方式
3.List集合与数组相互转化 : 以String类型为例
4.java中如何将字符串数组转换成字符串
5.Java 字符串转char数组
上代码:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
public class demo2 {
static char[]ch;
static String s;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
ArrayList<String>arrylist=new ArrayList<String>();
while(true){//先做个死循环
String s=sc.nextLine();
if(s.equals("")) {//若接收了回车键就停止循环
break;
}
else
{
arrylist.add(s);//停止输入前一直将字符串放入集合
}
}
String[] ss=arrylist.toArray(new String[arrylist.size()]);//将集合转化为数组,链接详解
StringBuffer sb = new StringBuffer();//字符串缓冲区
for(int i = 0; i < ss.length; i++){
sb. append(ss[i]);
}
String str = sb.toString();//将缓冲区内容转化为字符串
ch=str.toCharArray();
//新建hashMap
HashMap<Character, Integer> map=new HashMap<Character, Integer>();
/*遍历字符数组,三目运算,
若第一次遍历到该字符则存储键并赋值1,
若非第一次则旧键值+1*/
for(char c:ch) {
map.put(c,!map.containsKey(c)?1:map.get(c)+1);
}
while(!map.isEmpty()) {//判断该map是否为空,因为后面要进行移除键值对操作
int maxValue =0;//假设定义最大键值为0
Character maxkey =null;//设置最大键为null
for(Character key:map.keySet()) {//遍历map所有键,用key接收
int value=map.get(key);//value接收键值
if(maxValue<value) {//若当前遍历的键值大于maxValue,则更新最大键和最大键值
maxValue=value;
maxkey=key;
}
}
System.out.println(maxkey+":"+maxValue);//输出该次遍历得到的最大键值对
map.remove(maxkey);//将最大键值对移除,重写找第二大键值对
}
}
}
效果:
输入多行,最后按两下回车结束输入,输出结果