题目描述:
输入一段英文文本,用程序统计出现频率最高和最低的两个单词;
仅大小写不同的单词算同一个单词;
如果两个单词出现次数相同,则在文本中首次出现的单词优先返回。
返回的单词统一用小写字母返回
英文文本中仅出现这四类字符:空格( )、英文逗号(,)、英文句号(.)、英文大小写字母(a-z、A-Z)
单词之间的分隔符仅考虑这三种:空格( )、英文逗号(,)、英文句号(.);
例如:
输入字符串“Hello world, i said hello world to the world”,返回“world”,“i”
输入字符串“Somebody like somebody,i do not like it”,返回“somebody”,“i”
要求实现函数:
void WordStat(const char * pInputStr, char * pOutputHotWord, char * pOutputColdWord);
【输入】 pInputStr: 输入字符串,指向一段英文文本
【输出】 pOutputHotWord: 输出字符串,返回出现次数最多的单词,该指针所指存储空间已经分配好,且足够大
pOutputColdWord:输出字符串,返回出现次数最少的单词,该指针所指存储空间已经分配好,且足够大
示例
输入:“Hello world, i said hello world to the world”
代码实现:
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 输入一段英文文本,用程序统计出现频率最高和最低的两个单词;
仅大小写不同的单词算同一个单词;
如果两个单词出现次数相同,则在文本中首次出现的单词优先返回。
返回的单词统一用小写字母返回
英文文本中仅出现这四类字符:空格( )、英文逗号(,)、英文句号(.)、英文大小写字母(a-z、A-Z)
单词之间的分隔符仅考虑这三种:空格( )、英文逗号(,)、英文句号(.);
例如:
输入字符串“Hello world,i said hello world to the world”,返回“world”,“i”
输入字符串“Somebody like somebody,i do not like it”,返回“somebody”,“i”
*
*/
public class WordStat {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
String input;
while(cin.hasNext()){
input=cin.nextLine();
if(!valid(input))
return;
wordStat(input);
}
}
private static boolean valid(String input) {
if(null==input||"".equals(input))
return false;
// Pattern pattern=Pattern.compile("[a-zA-Z\\s\\,\\.]+");
Pattern pattern=Pattern.compile("[a-z\\s\\,\\.]+",Pattern.CASE_INSENSITIVE);//忽略大小写
Matcher matcher=pattern.matcher(input);
if(matcher.matches())
return true;
return false;
}
private static void wordStat(String input) {
if(null==input||"".equals(input))
return;
String[] words=input.split("[\\s\\,\\.]");
LinkedHashMap<String, Integer> map=new LinkedHashMap<String, Integer>();//能够确保先后顺序
for (int i = 0; i < words.length; i++) {
String temp=words[i];
if(temp!=null&&!"".equals(temp)){
temp=temp.toLowerCase();
int count=1;
if(map.containsKey(temp)){
count=map.get(temp);
++count;
}
map.put(temp, count);
}
}
int max=1;
String maxStr = null;
int min=1;
String minStr = null;
Set<Entry<String, Integer>> set=map.entrySet();
//初始化最大最小值
for (Entry<String, Integer> ent:set) {
max=ent.getValue();
maxStr=ent.getKey();
min=ent.getValue();
minStr=ent.getKey();
set.remove(ent);
break;
}
for (Entry<String, Integer> ent:set) {
if(ent.getValue()>max){
max=ent.getValue();
maxStr=ent.getKey();
}else if(ent.getValue()<min){
min=ent.getValue();
minStr=ent.getKey();
}
}
System.out.println(maxStr+","+minStr);
}
}