灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2770回复:0

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

楼主#
更多 发布于:2012-09-08 09:44

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

[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的专栏


喜欢0 评分0
游客

返回顶部