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

时间: 2024-08-08 22:12:14

Java 求字符串中出现频率最高字符的相关文章

JAVA校验字符串中的每个字符是否都在GB2312字符集中

需要在服务器端校验前台表单中传来的字符串,是否符合GB2312编码(所有字符都在GB2312字符集). import java.io.UnsupportedEncodingException; public class EncodingValidationUtil { /** * 校验目标字符串中的字符是否均在GB2312字符集 * @param str * @return */ public static boolean isGB2312(String str) { if(str == nul

java求字符串中连续的数字为一个整体并返会连续的数字和共有多少个整数

public static void main(String[] args) { String strNumbers = "0123456789";//用来进行判断数字的 System.out.println("请输入一个字符串:"); String string = new Scanner(System.in).next(); //自定义输入 String[] strings = new String[string.length()];//自定义是字符串 Syst

java 删除字符串中的特定字符

/** * Delete any character in a given String. * @param inString the original String * @param charsToDelete a set of characters to delete. * E.g. "az\n" will delete 'a's, 'z's and new lines. * @return the resulting String */ public static String

java去除字符串中的特定字符

public static void updateFileNames(String url, String index){ File file = new File(url); //判断文件目录是否存在,且是文件目录,非文件 if(file.exists() && file.isDirectory()){ File[] childFiles = file.listFiles(); String path = file.getAbsolutePath(); for(File childFil

[2013百度软件研发笔试题] 求字符串中连续出现同样字符的最大值

题目完整描写叙述为:用递归的方式实现一个求字符串中连续出现同样字符的最大值.如aaabbcc,连续出现a的最大值为3,abbc,连续出现字符最大的值为2. 下面是我想出来的方法: #include <iostream> using namespace std; #define MAX(a, b) (a) > (b) ? (a) : (b) int Get(char *s, int n, int m)  //字符指针, 当前最长串, max最长串 {     if(*(s+1) == '\

[2013百度软件研发笔试题] 求字符串中连续出现相同字符的最大值

题目完整描述为:用递归的方式实现一个求字符串中连续出现相同字符的最大值,如aaabbcc,连续出现a的最大值为3,abbc,连续出现字符最大的值为2. 以下是我想出来的方法: #include <iostream> using namespace std; #define MAX(a, b) (a) > (b) ? (a) : (b) int Get(char *s, int n, int m)  //字符指针, 当前最长串, max最长串 {     if(*(s+1) == '\0'

Java 去除字符串中的空格和其他字符

直接上代码了. <span style="font-size:18px;">import java.util.regex.Matcher; import java.util.regex.Pattern; /** * java 去除字符串中的空格和其他字符 * @author YYBJ * @date 2014-10-19 */ public class CleanString { public static String replaceBlank(String str) {

java统计字符串中字符及子字符串个数

import java.util.Scanner;public class Counter { static Scanner scanner = new Scanner(System.in); public static void count(String s) { int low, upper, num, others; low = upper = num = others = 0; for (int i = 0; i < s.length(); i++) { if (Character.is

求字符串中某两个字符之间的字符

这个简单,留作纪念,学习之初写的: 求两个A之间的字符,并打印出来: 1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 7 const char Stra[40] = "sdfjAI Love You So Much !Ajidhj";//呵呵,乱输的 8 const char *p; 9 p = Stra; 10 11 while (*p != '\0') 12 { 13 if (*p ==