黑马程序员技术交流社区
标题:
练习:记录字母出现次数并排序
[打印本页]
作者:
Synaric
时间:
2015-10-8 08:58
标题:
练习:记录字母出现次数并排序
import java.util.Comparator;
import java.util.Map.Entry;
import java.util.TreeMap;
/*
* 需求:1、统计字符串中每个字母出现的次数
* 例如"sjokafjoilnvoaxllvkasjdfns",希望打印a(1)d(1)...
* 2、非字母不计
* 3、字母按a-zA-Z排序
* 思路:1、输出数据有明显的映射关系,且自然排序,应该用TreeMap,传入比较器初始化
* 2、对字符串遍历,对于每个字符,若存在于TreeeMap中,将值+1;若不在,存入TreeMap
*/
public class MapDemo_2 {
public static void main(String[] args) {
String string = "sjoAkaf+joilnBFJoax llA@vkasJdfns";
count(string, new CharComparator());
}
static void count(String string, CharComparator cc){
//创建一个结果集
TreeMap<Character, Integer> ciMap = new TreeMap<Character, Integer>(cc);
//对字符串的每个字符遍历
for (int i = 0; i < string.length(); ++i) {
char c = string.charAt(i);
//判断是否字母
if(c<65 || 90<c && c<97 || 122<c)
continue;
//查询集合获得计数,+1存入集合
//若没查找到,新建信息存入集合
if(ciMap.containsKey(c)){
ciMap.put(c, (ciMap.get(c) + 1));
}else{
ciMap.put(c, 1);
}
}
//遍历集合输出
showCount(ciMap);
}
static void showCount(TreeMap<Character, Integer> ciMap){
for(Entry<Character, Integer> entry : ciMap.entrySet()){
System.out.print(entry.getKey() + "(" + entry.getValue() + ")");
}
}
//自定义的比较器,按a-zA-Z排序
static class CharComparator implements Comparator<Character>{
@Override
public int compare(Character o1, Character o2) {
int result = range(o1, o2);
//若在不同区间
//区分a-z与A-Z两个区间的大小
if(0 != result) return result;
//若在同一区间,直接比较
return o1.compareTo(o2);
}
//若c1、c2在不同集合中,a-z为小,A-Z为大
//若在相同集合中,返回0
private int range(char c1, char c2){
int i = 1, j = 1;
if(c1 >= 97) i = 0;
if(c2 >= 97) j = 0;
if(i == j) return 0;
if(i > j) return 1; else return -1;
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2