黑马程序员技术交流社区

标题: 如何对TreeMap的值进行排序? [打印本页]

作者: CoeusLYJ    时间: 2015-5-7 15:13
标题: 如何对TreeMap的值进行排序?
本帖最后由 CoeusLYJ 于 2015-5-11 15:04 编辑

TreeMap拥有默认排序与定义排序,但是貌似只能对键进行排序,而不能对值进行排序?求解决方案。

作者: CoeusLYJ    时间: 2015-5-8 23:38
求大神解答~~~
作者: wkz_crystal    时间: 2015-5-9 00:15
  1. <font size="3">/*
  2.         可以对map中的值进行排序哈,请看下面我写的例子
  3. */
  4. import java.util.*;
  5. class Demo1
  6. {
  7.         public static void main(String[] args)
  8.         {
  9.                 Map<String,Integer> mp= new HashMap<String,Integer>();
  10.                 mp.put("A", 65);
  11.                 mp.put("B", 43);
  12.                 mp.put("C", 26);
  13.                 mp.put("D", 20);
  14.                 mp.put("E", 110);

  15.                 mapSort(mp); //排序前list:[D=23, E=85, A=98, B=50, C=76]
  16.         }

  17.         //按照值排序的方法
  18.         public static void mapSort(Map<String,Integer> mp)
  19.         {
  20.                 //简单的思想就是拿到键值对(Set集合)再存入list集合中去:
  21.                 List<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(mp.entrySet());
  22.                 System.out.println("排序前\t"+list);
  23.                
  24.                 Collections.sort(list,new MyCompl()); //自定义比较器排序
  25.                 System.out.println("排序后\t"+list);
  26.         }
  27. }

  28. //按照值来进行排序的自定义比较器
  29. class MyCompl implements Comparator<Map.Entry<String,Integer>>
  30. {
  31.         public int compare(Map.Entry<String, Integer> me1,Map.Entry<String, Integer> me2)
  32.         {
  33.                 int num=me1.getValue().compareTo(me2.getValue());
  34.                 if (num==0) //如果值一样,就按照键来排序
  35.                         return me1.getKey().compareTo(me2.getKey());
  36.                 return num;
  37.         }
  38. }

  39. /*结果
  40.         排序前  [D=20, E=110, A=65, B=43, C=26]
  41.         排序后  [D=20, C=26, B=43, A=65, E=110]
  42. */</font>
复制代码



作者: wkz_crystal    时间: 2015-5-9 00:16
wkz_crystal 发表于 2015-5-9 00:15

没有做不到,只有想不到哈!但是想的东西必须得符合一定的逻辑才行!是吧?
作者: 弯曲/mg抛物☀    时间: 2015-5-9 07:57
可以有两种排序,存入的对象实现comparable接口,或Map<String,Integer> mp= new HashMap<String,Integer>(new MyCompl());传入一个比较器。
作者: CoeusLYJ    时间: 2015-5-11 15:04
wkz_crystal 发表于 2015-5-9 00:15

非常感谢!!!原来可以这样做,真的没有想到。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2