Map的值排序

需求:统计字符串"abadcdffbaeba"中每个字符出现的次数,按次数排序并输出。例如:c:1,e:1,d:2,f:2,b:3,a:4

思路:   1,把字符串变成字符数组 toCharArray()   2,创建TreeSet集合 把   3,遍历char数组,把遍历的字符通过containChar(char)返回如果为真 pub(char,get(char)+1)加入集合中,否则,put(char,1)加进去。   4,因为TreeSet集合只能key排序,不能值排序(如果用自定义比较器对Set集合进行值排序,会使相同value的键值对无法存入集合,     因为比较器的compare方法对Set集合也具有保证数据唯一性的特点),所以把TreeSet集合转换成List集合。   5,通过Collections工具包的sort(List list,Comparator comparator)进行自定义比较器的排序   6,List转换成Map集合并打印key和value

  1. import java.util.ArrayList; 
  2. import java.util.Arrays; 
  3. import java.util.Collections; 
  4. import java.util.Comparator; 
  5. import java.util.LinkedHashMap; 
  6. import java.util.List; 
  7. import java.util.Map; 
  8. import java.util.Set; 
  9. import java.util.TreeMap; 
  10.  
  11.  
  12.  
  13. publicclass StringTest { 
  14.  
  15.  
  16.     publicstaticvoid main(String[] args) { 
  17.          
  18.         String s =  "abadcdffbaeba"
  19.         char[] chars = s.toCharArray(); 
  20.         Map<Character, Integer> map = new TreeMap<Character, Integer>(); 
  21.         for(char ch : chars){ 
  22.             if(map.containsKey(ch)) 
  23.                 map.put(ch, (map.get(ch)+1)); 
  24.             else  
  25.                 map.put(ch, 1);          
  26.         } 
  27.          
  28.         Map<Character, Integer> resultMap = sortMapByValues1(map); 
  29.         Set<Character> set = resultMap.keySet(); 
  30.         for(Character ch : set){ 
  31.             System.out.println(ch+":"+resultMap.get(ch)); 
  32.         } 
  33.     } 
  34.      
  35.     //第一种方法:通过把Map的entrySet的Set集合转换成List集合 ,通过Collections工具包sort方法自定义比较器对List集合排序  
  36.     publicstatic Map<Character, Integer> sortMapByValues1(Map<Character, Integer> map){ 
  37.          
  38.         //1,创建一个指定大小的AraayList集合  
  39.         List<Map.Entry<Character, Integer>> list = new ArrayList<Map.Entry<Character, Integer>>(map.size()); 
  40.          
  41.         //2,添加Map集合的键值对entrySet集合  
  42.         list.addAll(map.entrySet()); 
  43.          
  44.         //3,对List排序  
  45.         Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>(){ 
  46.             @Override 
  47.             publicint compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) { 
  48.  
  49.                 return o1.getValue().compareTo(o2.getValue()); 
  50.                  
  51.             } 
  52.              
  53.         }); 
  54.         //4,LinkedHashMap集合是Map的子类,随put插入的顺序进行排序,如同List,优化了HashMap的乱排序,优化了TreeMap的负责实现。  
  55.         Map<Character, Integer> sortedMap = new LinkedHashMap<Character, Integer>(); 
  56.          
  57.         //5,把排序后List集合转换成sortedMap集合  
  58.         for(Map.Entry<Character, Integer> entry : list){ 
  59.             sortedMap.put(entry.getKey(), entry.getValue()); 
  60.         } 
  61.         //6,返回sortedMap集合  
  62.         return sortedMap; 
  63.     } 
  64.      
  65.     //第二种方法:通过把Map的entrySet的Set集合转换成array数组 ,通过Arrays工具包sort方法自定义比较器对数组排序  
  66.     publicstatic Map<Character, Integer> sortMapByValues2(Map<Character, Integer> map){ 
  67.         //获取Map.Entry映射项  
  68.         Set<Map.Entry<Character, Integer>> set =  map.entrySet(); 
  69.         //set集合转数组  
  70.         Map.Entry<Character, Integer>[] array = set.toArray(new Map.Entry[set.size()]); 
  71.         //通过数组工具类的sort(Comparator comparator)方法对数组进行排序  
  72.         Arrays.sort(array, new Comparator<Map.Entry<Character, Integer>>(){ 
  73.  
  74.             @Override 
  75.             publicint compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) { 
  76.                  
  77.                 return o1.getValue().compareTo(o2.getValue()); 
  78.                  
  79.             } 
  80.              
  81.         }); 
  82.         Map<Character, Integer> sortedMap = new LinkedHashMap<Character, Integer>(); 
  83.         for(Map.Entry<Character, Integer> entry : array){ 
  84.             sortedMap.put(entry.getKey(), entry.getValue()); 
  85.         } 
  86.         return sortedMap; 
  87.     } 
  88.  

转载于:https://www.cnblogs.com/tiandile/archive/2013/03/20/2970678.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值