Map----TreeMap
2018-09-19 本文已影响0人
东风谷123Liter
问题:现在有一串字母,要求对他进行排序,并统计每个字母的个数,
让字母与字母个数相互映射; 如:“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;
}
}
结果:
![](https://img.haomeiwen.com/i8043783/0b67555048ea640a.png)
- 改进代码,让打印格式符合要求,在方法内部加上:
//因为返回的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");
结果:
![](https://img.haomeiwen.com/i8043783/3c038bc17c4d88ff.png)
- 改进代码去掉标点符号:
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;
}