针对java.util.Map的Value做排序

来源:百度文库 编辑:神马文学网 时间:2024/04/29 08:55:37

http://140.123.26.152/portfolio/NUBlog/article.php?u=695430005&i=2008048

 

针对java.util.Map的Value做排序(1)

 

如何将java.util.Map依照其Value值来做排序(由大至小)呢?

Map的特性:
    Map内涵数据是Key -> Value的架构集合体,而Key是属于Set的架构集合体,也就是说Key的值是唯一的,而Value的值可以重复。一般常用的对象是HashMap或TreeMap,如果考虑效能的话,建议使用HashMap,如果希望Key值有顺序性,就使用TreeMap吧!所以Map的集合体,数据的摆放方式是没有顺序性的,我们需要借助有顺序性的集合体List来帮忙。

范例数据如下定义:
Map map_Data = new HashMap();
map_Data.put("A", 98);
map_Data.put("B", 50);
map_Data.put("C", 76);
map_Data.put("D", 23);
map_Data.put("E", 85);
System.out.println(map_Data);

现在将Map集合体转换成List集合体,而List对象使用ArrayList来实做如下:
//将map_Data由Map型态转成List型态的list_Data,以便进行排序
List> list_Data = new ArrayList>(map_Data.entrySet());

透过Collections.sort(List l, Comparator c)方法来做排序的动作,由传入参数可以了解List l就是要排序的数据结构体,另外还需要一个Comparator c对象,此对象是用来评估List l中的任两对象的大小值,实做如下:
//排序
Collections.sort(list_Data, new Comparator>()

    public int compare(Map.Entry o1, Map.Entry o2)
    {
        return (o2.getValue() - o1.getValue());
    }
});
上方的Comparator c参数是使用匿名类别的方式来实做的。

所以排序完成的数据内容在list_Data这个对象中,将其印出来看结果:
System.out.println(list_Data);

 


http://140.123.26.152/portfolio/NUBlog/article.php?u=695430005&i=20080412


针对java.util.Map的Value做排序(2)

上一篇介绍的Value数据型态是Integer,那Double型态怎么做呢?

因java.util.Comparator这个interface(接口)的compare方法,其回传型态只有整数型态,定义如下:
int compare(java.lang.Object o1, java.lang.Object o2)

范例数据改成如下: 
Map map_Data = new HashMap();
map_Data.put("A", 98.89);
map_Data.put("B", 50.777);
map_Data.put("C", 76.566);
map_Data.put("D", 23.001);
map_Data.put("E", 23.899);

参照 针对java.util.Map的Value做排序(1) 的例子,除了数据型态由Integer改成Double之外,最重要的地方在红色字体部份,如下标示:
//排序
Collections.sort(list_Data, new Comparator>()

    public int compare(Map.Entry o1, Map.Entry o2)
    {
        return (o2.getValue() - o1.getValue());
    }
});

因为compare方法只能回传int型态,所以将红色字体的结果强制转形成int型态,语法如下:
return (int)(o2.getValue() - o1.getValue());

这样做会发生一个问题,注意资料中("D", 23.001)、("E", 23.899),这两笔资料在强制转型后,都是23,没有办法准确反映出浮点数的部份,解决方法不难,先确定要取得的小数点位数是多少,像此范例刚好都是小数点三位,那就取到小数点三位,再强制转成整数,这样就可以排出正确大小了。程序代码修改如下:
return (int)((o2.getValue() - o1.getValue()) * 1000.0);

 

 

(#)