单词统计

本文介绍了一个Java程序,用于统计一段英文文本中出现频率最高和最低的两个单词,并确保大小写不敏感。通过使用正则表达式验证输入的有效性,并利用LinkedHashMap来保持单词首次出现的顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

   输入一段英文文本,用程序统计出现频率最高和最低的两个单词;

       仅大小写不同的单词算同一个单词;

       如果两个单词出现次数相同,则在文本中首次出现的单词优先返回。

       返回的单词统一用小写字母返回

       英文文本中仅出现这四类字符:空格( )、英文逗号(,)、英文句号(.)、英文大小写字母(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);
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值