对于求字符串中出现频率最高字符的算法实现

好久没写文章了,今天写了“求字符串中出现频率最高字符”的一个算法实现,代码中有非常详细思路注释
本算法只是此问题一种解法,还有许多需要改进的地方,但这是个人目前想到的比较好的解决方案
如有更好的解决方案,多谢指正!
以下代码仅供参考
 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/*
 * 主要思路:先将字符串存入set集合,以保证没有重复字符
 * 然后取出set集合中的每一个字符,并用String的indexOf()方法进行索引
 * 若索引不为-1,则说明该字符存在,记录其在字符串中的索引位置
 * 并将记录字符出现次数的变量++,再从当前索引位置+1处开始进行索引,
 * 直到索引值为-1,则退出循环,至此每个字符出现的频率都已记录
 * 接下来采用map进行字符与字符所对应的频率进行存储
 * 再将map的values形成一个ArrayList集合
 * 将计算得到的最大频率与map中的值进行比较
 * 若相等,则其为最大频率的字符
 */
public class HighFrequencyWord {
	
	//找出字符串或文件中频率出现最高的字符
	public static void findFrequencyWord(String str) {
		Collection<Integer> al=new ArrayList<Integer>();
		Map<String,Integer> map=new HashMap<String,Integer>();
		String tempStr = str;
		String[] stringArray = str.split("");
		//用来存储字符串里每个出现过的字符,且不会出现重复的
		Set<String> set = new HashSet<String>();
		int stringLength = stringArray.length;
		for (int i = 0; i < stringLength; i++) {
			set.add(stringArray[i]);
		}
		//移掉set中的一个空字符
		set.remove("");
		
		System.out.println(set);
		int count = 0;
		boolean flag = true;
		
		for (String s : set) {
			
			while (flag) {
				//如果索引存在
				if (tempStr.indexOf(s) != -1) {
					//记录出现字符的当前位置
					int index = tempStr.indexOf(s);
					//让字符串从下一索引处开始
					tempStr = tempStr.substring(index+1);
					//如果索引存在,记录值加1
					count++;
					
				} else {
					//如果索引不存在,赋值false退出循环
					flag = false;
				}
				
			}
			//为了执行下一循环
			flag = true;
			//把值存入map,让字符与其频率对应
			map.put(s,count);
			//因为是上一结果,所以让值归零,并且字符串变回原来的字符串
			count = 0;
			tempStr = str;
			
		}
		//将map的值变为一个列表
		al= map.values();
		//然后转为数组
		Integer[] stringCount =al.toArray(new Integer[]{});
		int countLength=stringCount.length;
		//按升序排序
		Arrays.sort(stringCount);
		//得到数组最大值
		int max=stringCount[countLength-1];
		for(String s: set){
			for(int i=0;i<countLength;i++){
				//如果map的值与最大值相同,则输出
				if(map.get(s)==max){
					System.out.println(s + ":" + max);
				}
			}
			
		}
	}
	
	public static void main(String[] args) {
		findFrequencyWord("ababb");
	}
}


 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值