排序之List集合里Map的value排序

(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);
            }
        });
Look,lambda表达式是不是看起来更简洁,java也在更新,多了解一些java的新特性。让自己更方便的写代码。希望各位同学默默加油咯。

猜你喜欢

转载自blog.csdn.net/sinat_29039125/article/details/88306345