对于求字符串中出现频率最高字符的算法实现
3204 点击·0 回帖
![]() | ![]() | |
![]() | 好久没写文章了,今天写了“求字符串中出现频率最高字符”的一个算法实现,代码中有非常详细思路注释 本算法只是此问题一种解法,还有许多需要改进的地方,但这是个人目前想到的比较好的解决方案 如有更好的解决方案,多谢指正! 以下代码仅供参考 [java] 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); } //移掉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"); } } 摘自 Hellojava1234的专栏 | |
![]() | ![]() |