zoukankan      html  css  js  c++  java
  • 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[i]); 
            } 
            
            // 移掉set中的一个空字符 (哪一个?什么意思??)
            set.remove("");
             
            System.out.println(set);// 这里输出为 [ , a, b, c] 
            
            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);// 往后继续查询 
                        count++; 
                    } else { 
                        flag = false;// 如果索引不存在,赋值false退出循环 
                    } 
                }
                flag = true;// 为了执行下一循环
                map.put(s,count);// 记录字符与其对应频率,并存放在map中
                
                // 初始化结果,为下次循环做准备
                count = 0; 
                tempStr = str; 
            } 
            
            // 将map的value转为一个List
            al= map.values();
            // 再转为数组
            Integer[] stringCount =al.toArray(new Integer[]{}); 
            
            Arrays.sort(stringCount);// 按升序排序
            
            int countLength=stringCount.length; 
            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);// Q: 这样循环结果会输出多次,如何只输出一次??
                    } 
                } 
            }
            
        } 
        
        public static void main(String[] args) { 
            findFrequencyWord("abab bc"); 
        } 
    } 

    原文:http://www.2cto.com/kf/201205/133219.html,此处略有改动。

  • 相关阅读:
    P1352 没有上司的舞会
    P1879 [USACO06NOV]玉米田Corn Fields
    P1896 [SCOI2005]互不侵犯
    2019寒假纪中happy之旅
    JZOJ 4249. 【五校联考7day1】游戏
    JZOJ 4248. 【五校联考7day1】n染色
    JZOJ 4252. 【五校联考7day2】QYQ的图
    STM32初学Keil4编译时出现 Error:Failed to execute 'BIN40/Armcc'
    STM32初学Keil4编译时出现 Error:Failed to execute 'BIN40/Armcc'
    重踏学习Java路上_Day02(java 基础上)
  • 原文地址:https://www.cnblogs.com/jaxer/p/4593917.html
Copyright © 2011-2022 走看看