天天看点

TreeMap获取字符串中字母出现次数

需求:”ahg,,djks..bvagav?vftk”获取该字符串中字母出现的次数

希望打印结果:a(3)b(1)d(1)f(1)g(2)h(1)j(1)k(2)s(1)t(1)v(3)

通过打印结果发现每一个字母都有对应的次数,说明了字母和次数之间有映射关系。所以可以选择map集合,因为map集合中的存放就是映射关系。

思路:

  1. 将字符串转换成字符数组。因为要对每个字母进行操作。
char[] chs=str.toCharArray();
           
  1. 定义一个map集合,因为打印结果的字母有序,所以使用TreeMap.
TreeMap<Character,Integer> tm=new TreeMap<Character,Integer>();
           
  1. 遍历字符数组

    将每一个字母作为键去查map集合。如果返回null,将该字母和1存入map集合;如果返回不是null,说明该字母在map集合中已经存在并有对应的次数,,那么就获取该次数并进行自增,然后将该字母和自增后的次数存入map集合,覆盖原来键所对应值。

  2. 将map集合中的数据变成指定的字符串形式返回。

“`

import java.util.*;

public class TreeMapTest1 {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    String s=charCount("ahg,,djks..bvagav?vftk");
    System.out.print(s);
}

public static String charCount(String str)
{
    char[] chs=str.toCharArray();

    TreeMap<Character,Integer> tm=new TreeMap<Character,Integer>();

    int count=0;
    for(int x=0;x<chs.length;x++)
    {

        if(!(chs[x]>='a'&&chs[x]<='z'||chs[x]>='A'&&chs[x]<='Z'))
            continue;

        Integer value=tm.get(chs[x]);

        if(value!=null)
            count=value;
        count++;
        tm.put(chs[x], count);

        count=0;
        /*
        if(value==null)
        {
            tm.put(chs[x], 1);
        }
        else
        {
            value=value+1;
            tm.put(chs[x], value);
        }
        */
    }

    //System.out.println(tm);

    StringBuilder sb=new StringBuilder();
    Set<Map.Entry<Character,Integer>> entry=tm.entrySet();

    Iterator<Map.Entry<Character,Integer>> it=entry.iterator();
    while(it.hasNext())
    {
        Map.Entry<Character,Integer> me=it.next();
        Character key=me.getKey();
        Integer value=me.getValue();

        //System.out.print(key+"("+value+")");
        sb.append(key+"("+value+")");
    }


    return sb.toString();
}
           

}

运行结果:

TreeMap获取字符串中字母出现次数

继续阅读