黑马程序员技术交流社区

标题: TreeMap有没有办法按照value排序 [打印本页]

作者: 张云杰    时间: 2013-6-27 01:58
标题: TreeMap有没有办法按照value排序
本帖最后由 孙百鑫 于 2013-6-30 08:45 编辑

想了很多方法都不好使用.也百度了很多方法.. 不知道各位高手有没有好的方法 给推荐下, 需要按照value排序 应该要怎么做



作者: 王靖远    时间: 2013-6-27 02:09
在做15分那题吗?我给你个思路。你把再new一个TreeSet<String>集合 把TreeMap集合中的key和value合在一起变成一个数组。然后自定义一个Comparator比较器去给TreeSet集合排序。这样就OK啦。
作者: 王靖远    时间: 2013-6-27 02:13
王靖远 发表于 2013-6-27 02:09
在做15分那题吗?我给你个思路。你把再new一个TreeSet集合 把TreeMap集合中的key和value合在一起变成一个数 ...

“变成一个数组”这里打错了,应该变成字符串。
作者: 张云杰    时间: 2013-6-27 02:21
王靖远 发表于 2013-6-27 02:09
在做15分那题吗?我给你个思路。你把再new一个TreeSet集合 把TreeMap集合中的key和value合在一起变成一个数 ...

等等 等等 什么意思 说清楚点 愣是没看懂
作者: 张云杰    时间: 2013-6-27 02:22
王靖远 发表于 2013-6-27 02:13
“变成一个数组”这里打错了,应该变成字符串。

晓得了, 我先试下 多谢哥们
作者: 张云杰    时间: 2013-6-27 02:23
王靖远 发表于 2013-6-27 02:13
“变成一个数组”这里打错了,应该变成字符串。

你的意思是说 我遍历出来的集合 全部给他组合成一个数组. 然后我比较器里写什么? 用什么做比较
作者: 张云杰    时间: 2013-6-27 02:24
王靖远 发表于 2013-6-27 02:13
“变成一个数组”这里打错了,应该变成字符串。

哦 不对我也手贱了.. 是遍历出来组成字符串, 然后 比较器里写什么?
作者: 王靖远    时间: 2013-6-27 02:26
TreeMap<Student,Integr>
TreeSet<String>ts = new TreeSet<String>(new MyComparator);
String string = student.toString()+integer; 在自定义比较器里把string里面的Integer也就是次数用String类中的方法取出来,然后拿来比较

作者: chensc    时间: 2013-6-27 08:35
学习学习!
作者: zms2100    时间: 2013-6-27 08:54
这个感觉跟我之前的做过的一道题很像,反正都是按Value排序,贴下我翻出来的代码,O(∩_∩)O~(自己现在都忘可以这样做,呵呵)。
原理是: 定义一个比较器给TreeSet集合,比较器比较的内容是通过Map.Entry的获取到键对应的值(比较器接收两个键,但是是通过键获取到值,用值进行比较);
  1.                
  2. final TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();
  3. //...................................(这里是给TreeMap添加键值的过程,因为有使用局部使用,所以上面需final修饰)
  4. //创建一个以Map映射中的Value排序的TreeSet集合;
  5.                 TreeSet<Character> ts = new TreeSet<Character>(new Comparator<Character>(){
  6.                                 public int compare(Character c1,Character c2)
  7.                                 {
  8.                                         int num = tm.get(c2)-tm.get(c1);
  9.                                         if(num==0)
  10.                                         {
  11.                                                 return c1.compareTo(c2);
  12.                                         }
  13.                                         return num;
  14.                                 }});
  15.                 for(Character i : tm.keySet())        //将Map中的键存入该TreeSet集合;
  16.                 {
  17.                         ts.add(i);
  18.                 }
复制代码
这个方法应该挺不错了,呵呵,仅供参考。
作者: 郭伟杰    时间: 2013-6-27 10:10
10#        3Q    !    !     !
作者: zms2100    时间: 2013-6-27 16:09
郭伟杰 发表于 2013-6-27 10:10
10#        3Q    !    !     !

O(∩_∩)O~...........知识都是相互参考,这也只是一种方式,Ls童鞋的另一种方式将映射转成字符串等也可行,只不过我之前写的这种方式,比较便捷,其实我今天开头想到的是另外的方式(取出值排序,之后遍历Map的键,查看该映射关系是否与值对应),也没这么便捷,呵呵。
作者: 郭伟杰    时间: 2013-6-27 19:01
但我试了 有问题啊  TreeSet的内部类在引用外部的TreeSet是即使TreeSet前面加了final也不行,引用不成的!
作者: 张云杰    时间: 2013-6-27 20:25
请版主改成已解决.. 我根据靖远兄弟的思路 已经做出来了 15分题 表示已经拿下了
作者: 张云杰    时间: 2013-6-27 20:26
zms2100 发表于 2013-6-27 08:54
这个感觉跟我之前的做过的一道题很像,反正都是按Value排序,贴下我翻出来的代码,O(∩_∩)O~(自己现在都忘 ...

跟你做的 稍微有一点点不太一样就是,, 大致的思路差不多
作者: 孙百鑫    时间: 2013-6-30 08:45
楼主您好,帖子长时间没有动态我已经将您的帖子改成已解决。如有问题请私密我哦~




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