黑马程序员技术交流社区

标题: TreeMap集合中如何按值的顺序输出. [打印本页]

作者: 王璐    时间: 2012-6-22 14:46
标题: TreeMap集合中如何按值的顺序输出.
本帖最后由 王璐 于 2012-6-30 10:21 编辑

import java.util.*;
class  Print
{
public static void main(String[] args)
{
TreeMap<Character,Integer> tm=new TreeMap<Character,Integer>();
tm.put('a',5);
tm.put('f',6);
tm.put('s',1);
tm.put('d',2);
System.out.println(tm);
}
}


如何将TreeMap集合中的元素按值进行排序输出,例如以上代码,将其输出为{1=s,2=d,5=a,6=f}??

作者: 陈嘉宾    时间: 2012-6-22 14:57
利用Collections里的Collections.sort方法,重写sort方法传入比较器
作者: 王晓新    时间: 2012-6-22 15:21
List arrayList = new ArrayList(tm.entrySet());
Collections.sort(arrayList, new Comparator()
{
    public int compare(Object o1, Object o2)
   {
         Map.Entry obj1 = (Map.Entry) o1;
         Map.Entry obj2 = (Map.Entry) o2;
         return ((Integer)obj2.getValue()).compareTo((Integer) obj1 .getValue());
   }
});
System.out.println(arrayList);

用这个方法比较
作者: 王璐    时间: 2012-6-22 15:24
陈嘉宾 发表于 2012-6-22 14:57
利用Collections里的Collections.sort方法,重写sort方法传入比较器

Collections只能操作list集合,将TreeMap中的元素取出放到List集合,在排序,有没有简洁的方法,在Treemap集合中就能实现的?
作者: oracleserver    时间: 2012-6-22 15:43
本帖最后由 oracleserver 于 2012-6-22 15:45 编辑

java.util.TreeMap 放入其中的value,自动按key进行排序, 默认的排序规则按ascii码排序,如果是key是英文和数字不会有问题,如果中文

则会出现问题,需要自己写排序规则。


比较器需要实现java.text.Collator类,例如:
  1. package cn.tjopen.mediaman.util;

  2. import java.text.CollationKey;
  3. import java.text.Collator;

  4. public class CollatorComparator extends Collator {
  5. private Collator collator = Collator.getInstance();
  6. private int sort=1;
  7. @Override
  8. public int compare(String arg0, String arg1) {
  9.   CollationKey key1 = collator.getCollationKey(arg0);
  10.      CollationKey key2 = collator.getCollationKey(arg1);
  11.      return sort*key1.compareTo(key2);
  12. }
  13. /**
  14.   * 设定排序的方向
  15.   * @param i 排序方向(正数:正序;负数:倒序)
  16.   */
  17. public void setSort(int i){
  18.   if(i>0){
  19.    sort=1;
  20.   }else if(i<0){
  21.    sort=-1;
  22.   }
  23. }
  24. public CollationKey getCollationKey(String arg0) {
  25.   return null;
  26. }
  27. public int hashCode() {
  28.   return 0;
  29. }

  30. }
复制代码
比较器的使用:

int sort = 1;//>0正序<0倒叙

CollatorComparator comparator = new CollatorComparator();
  comparator.setSort(sort);
  Map map = new TreeMap(comparator);

然后在把要排序的字段作为key,相应的信息作为对应的value,即可实现排序

注意:key值不能重复,如果排序字段有重复,则需要进行处理。

例如:方法一:在向map中存放数据时,先判断要放的key是否已存在,如果存在在当前值后面加一区分标记

方法二:如果信息中有不可能重复的字段,在排序字段后面加上这个不重复的字段值,把这个组合当做key
作者: 陈嘉宾    时间: 2012-6-22 15:44
我觉得只能用这种方法,传入list的集合自定比较方法。还算简洁吧。。。没几行的。




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