- /**
- * 统计字符串”abadcdffbaeba”中每个字符出现了多少次,按次数排序并输出。
- 例如:c : 1,e : 1,d : 2,f : 2,b : 3,a : 4
- * @author Administrator
- * 在TreeMap中,是根据 Key来排序的,现在我想根据value来排序。
- 所以我把TreeMap中的键值对映射关系存入到List中,List中的元素类型是Map.Entry<Character, Integer>
- 然后根据Collections类中的sort方法来排序。自己要定义一个比较器来定义比较规则
- */
- public class Test {
- public static void main(String[] args) {
- count("abadcdffbaeba");
- }
- private static void count(String string) {
- Map<Character, Integer> map = new TreeMap<Character, Integer>();
- char[] chars = string.toCharArray();
- for(char ch : chars){
- if(map.containsKey(ch)){
- int oldValue = map.get(ch);
- int newValue = oldValue+1;
- map.put(ch, newValue);
- }else{
- map.put(ch, 1);
- }
- }
- System.out.println("排序前:"+map);
- //开始排序
- //将map中的每个映射关系Entry存入List<Map.Entry<Character, Integer>>中
- List<Map.Entry<Character, Integer>> list = new ArrayList<Map.Entry<Character, Integer>>();
- Set<Map.Entry<Character, Integer>> entrySet = map.entrySet();
- for(Map.Entry<Character, Integer> entry : entrySet){
- list.add(entry);
- }
- //根据Collections工具类的sort方法来对List中的元素进行排序
- Collections.sort(list,new MyComparator());
- //打印排序后的集合
- System.out.println("排序后:");
- for (int i = 0; i < list.size(); i++) {
- if(i>0)
- System.out.print(" , ");
- System.out.print(list.get(i).getKey()+" : "+list.get(i).getValue());
- }
- }
- }
- /**
- * 自定义比较器
- * @author Administrator
- *
- */
- class MyComparator implements Comparator<Map.Entry<Character,Integer>>{
- public int compare(Entry<Character, Integer> o1,Entry<Character, Integer> o2) {
- return o1.getValue()-o2.getValue();
- }
- }
复制代码 不知道有没有其他的方式对TreeMap进行排序。是按照value来排序的,按照key排序的就不用了
我这个排序方法严格来说还不行。照理说应该在map里面的元素已经按照value的顺序存放的,但是我写的代码里,只是相当于复制了一份map,然后通过List集合操作排序。原先的map顺序还是没变的 |
|