排序之List<Map<String,Object&
2019-03-07 本文已影响1人
prisoner_mirror
(Notice:欢迎交流和沟通,Wx:IT_Ezra,QQ 654303408。 有问题讨论也可联系我。)
(PS:其实当我们在工作中,有时候会用到这种排序,所以我在这里会稍微介绍一下这种排序,主要运用到了集合类。)
为什么我们需要做排序?
排序对于我们来说是一件非常基础的事情,排序算法有很多,但是在实际过程中,我们为必也用得到。因为java都为我们封装好了,我们可以更加去了解arrays.sort()和collections.sort()的排序算法实现。collection内部是使用的arrays.sort。而arrays.sort()的实现就是归并加排序。对于网上的一些技术贴,里面也提到了如果数组长度小于47,就会使用插入算法。如果小于286就会使用双轴快速排序,如果大于286就会使用归并算法。还有目前一个Timsort算法算法,可以了解一下。另外也有一个说法就是,Arrays.sort() 采用了2种排序算法 -- 基本类型数据使用快速排序法,对象数组使用归并排序。所以可以看到,了解这些还是有必要的。
点题
其实这个问题,我们使用了collections.sort()方法,其中第一个参数为List的泛型,任何对象都可以。包括Map,后面跟的的比较器comparator(),然后重写比较器里面的compare方法()。返回值为int,如果正数为正序,负数为逆序。通常是Obecjt_1.compareTo(Object_2)。放一段代码可以体验一下。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class java_ListMapSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("name", "p");
map1.put("cj", "5");
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("name", "h");
map2.put("cj", "12");
Map<String, Object> map3 = new HashMap<String, Object>();
map3.put("name", "f");
map3.put("cj", "31");
list.add(map1);
list.add(map3);
list.add(map2);
//排序前
for (Map<String, Object> map : list) {
System.out.println(map.get("cj"));
}
Collections.sort(list, new Comparator<Map<String, Object>>() {
public int compare(Map<String, Object> o1, Map<String, Object> o2) {
Integer name1 = Integer.valueOf(o1.get("cj").toString()) ;//name1是从你list里的第一个name
Integer name2 = Integer.valueOf(o2.get("cj").toString()) ; //name2是从你list里的第二个name
return name1.compareTo(name2);
}
});
//排序后
System.out.println("-------------------");
for (Map<String, Object> map : list) {
System.out.println(map.get("cj"));
}
}
}
对于java1.7,我们是使用的这种方法。对于java1.8的新特征,有了Lambda表达式。代码写起来就更加简单了一点。核心代码如下。如果你的map里面本身放的就是int类型,就可以不需要转型了。直接get(“key”),然后进行比较。
Collections.sort(list, (o1,o2)-> {
Integer name1 = Integer.valueOf(o1.get("cj").toString()) ;//name1是从你list里的第一个name
Integer name2 = Integer.valueOf(o2.get("cj").toString()) ; //name2是从你list里第二个name
return name1.compareTo(name2);
}
});