美文网首页
Map----TreeMap

Map----TreeMap

作者: 东风谷123Liter | 来源:发表于2018-09-19 08:55 被阅读0次

问题:现在有一串字母,要求对他进行排序,并统计每个字母的个数,
让字母与字母个数相互映射; 如:“asdfdfghfglkjasdgffgdf”
且,希望打印的结果是这样的:a(2)d(4)......

思路:

  • 1,有映射关系,就要选择Map集合;
  • 2,将字符串转换成字符数组。
  • 3,因为打印的字符串有顺序,所以选择TreeMap集合。
  • 4,以字母作为键,每天加一个元素都让这个元素的键去遍历整个键值表;
  • 如果该键已经存在,就让与他映射的值+1(用新的值覆盖掉原来的值);要不存在就调用HashMap的put()方法添加键和1;
  • 将TreeMap中的集合转化为指定字符串类型返回。
package jihe;
import java.util.*;
public class TreeMapDemo {
     public  static void main(String[] args) {
           countChar("asdafgdsghgkk");
     }
     public static String countChar(String str) {
           char[] ch = str.toCharArray();
           //由于字母要排序,所以选用TreeSet集合
           //由于char类型是数据类型不是对象类型,所以要换用Characater
           TreeMap<Character, Integer> tm = new TreeMap<Character,Integer>();
           for(int i=0; i<ch.length; i++) {
                Integer vlue = tm.get(ch[i]);
                if(vlue==null)
                     tm.put(ch[i], 1);
                else {
                     vlue++;
                     tm.put(ch[i], vlue);
                }
           }
           System.out.println(tm);//打印TreeSet集合
           return null;
     }
}

结果:

  • 改进代码,让打印格式符合要求,在方法内部加上:
//因为返回的String类型的字符串,所以可以调用String的缓冲区!
           StringBuilder sb = new StringBuilder();
           Set<Map.Entry<Character, Integer>> me = tm.entrySet();
           Iterator<Map.Entry<Character, Integer>> it = me.iterator();
           while(it.hasNext()) {
                Map.Entry<Character, Integer> men = it.next();
                Character cha = men.getKey();
                Integer con = men.getValue();
                sb.append(cha+"("+con+")");
           }
           return sb.toString();
  • 主函数调用情况:
String str = countChar("asdafgdsghgkk");
           System.out.println(str);
  • 结果:


  • 如果字符串中加入标点符号,标点符号不会作为键的。

String str = countChar(";asda,fgd.sg/hgkk");

结果:


  • 改进代码去掉标点符号:
public static String countChar(String str) {
           char[] ch = str.toCharArray();
           //由于字母要排序,所以选用TreeSet集合
           //由于char类型是数据类型不是对象类型,所以要换用Characater
           TreeMap<Character, Integer> tm = new TreeMap<Character,Integer>();
           for(int i=0; i<ch.length; i++) {
                Integer vlue = tm.get(ch[i]);
                if(!(ch[i]>'a'&&ch[i]<'z'||ch[i]>'A'&&ch[i]<'Z'))
                     continue;
                if(vlue==null)
                     tm.put(ch[i], 1);
                else {
                     vlue++;
                     tm.put(ch[i], vlue);
                }
           }
  • 其中循环判断部分还可以优化成:
int count = 0;
                for(int i=0; i<ch.length; i++) {
                     Integer vlue = tm.get(ch[i]);
                     if(!(ch[i]>'a'&&ch[i]<'z'||ch[i]>'A'&&ch[i]<'Z'))
                          continue;
                     if(vlue!=nul
                           count=vlue
                     }
                     count++;
                     tm.put(ch[i], count);
                     count=0;
                }

相关文章

  • Map----TreeMap

    问题:现在有一串字母,要求对他进行排序,并统计每个字母的个数,让字母与字母个数相互映射; 如:“asdfdfghf...

网友评论

      本文标题:Map----TreeMap

      本文链接:https://www.haomeiwen.com/subject/scebnftx.html