使用Java8中的多个键对地图列表进行排序

时间:2017-10-12 16:37:56

标签: java sorting java-8

我有地图列表,我想使用键对列表中的地图进行排序。截至目前,我正在使用以下Collections.sort方法实现此目标..

Collections.sort(listOfMaps, new Comparator<Map<String, String>>() {
        @Override
        public int compare(Map<String, String> o1, Map<String, String> o2) {
            //return o1.get("cm_order_x").compareTo(o2.get("cm_order_x"));
            String x1 = o1.get(Key1);
            String x2 = o2.get(Key1);
            String x3 = o1.get(Key2);
            String x4 = o2.get(Key2);
            int sComp = x1.compareTo(x2);
            int sComp1 = x3.compareTo(x4);
            if (sComp != 0) {
               return sComp;
            }
            else if(sComp1 != 0) {

                //return x3.compareTo(x4);
                return sComp1;
            }


                else
                {
                    String x5 = o1.get(Key3);
                    String x6 = o2.get(Key3);
                    return x5.compareTo(x6);
                }
             }

    });

还有其他更好的方法可以在Java 8中对list maps进行排序吗?

3 个答案:

答案 0 :(得分:3)

从Java8开始,Comparator接口提供工厂方法和链接方法:

Comparator<Map<String, String>> c
    = Comparator.comparing((Map<String, String> m) -> m.get(Key1))
                .thenComparing(m -> m.get(Key2))
                .thenComparing(m -> m.get(Key3))
                .thenComparing(m -> m.get(Key4));

listOfMaps.sort(c);

答案 1 :(得分:0)

我相信您可以使用以下代码完成此任务:

listOfMaps.sort(Comparator.comparing(
                m -> m.get("yourKey"), 
                Comparator.nullsLast(Comparator.naturalOrder()))
           )

请参阅:How can I sort a list of maps using Java 8?

答案 2 :(得分:0)

这是不可能的,因为你根据你所知道的东西进行分类。

我的意思是您首先按Key1进行比较,然后Key2等进行比较。按键未在地图中编号,此处Key1并不代表first key,但是some key that you want compared first。没有办法告诉java,这种行为太具体了。

你可以为通用解决方案提供一些东西(比如有更多键的地图,所以你不必像这样列出它们),但是你不会避免这个实现的主要问题。 / p>