在颜色之后对 arraylist 进行排序

sort arraylist after the color

我有一个 ArrayListMap<String, object>,我想在颜色之后对列表进行排序,以便红色地图在 ArrayList 中位于顶部,紧随其后的是蓝色地图和最后的其他颜色。目前,我正在按字母顺序对 ArrayList 进行排序。如何让 ArrayList 中的地图按照我的意愿排序?

代码:

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 Test {

    public static void main(String[] args) {
        List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();

        HashMap<String, Object> map1 = new HashMap<String, Object>();
        map1.put("name", "John");
        map1.put("color", "black");
        map1.put("size", 24);
        result.add(map1);

        System.out.println(map1);

        HashMap<String, Object> map2 = new HashMap<String, Object>();
        map2.put("name", "Liam");
        map2.put("color", "yellow");
        map2.put("size", 44);
        result.add(map2);

        System.out.println(map2);

        HashMap<String, Object> map3 = new HashMap<String, Object>();
        map3.put("name", "Noah");
        map3.put("color", "Pink");
        map3.put("size", 43);
        result.add(map3);

        System.out.println(map3);

        HashMap<String, Object> map4 = new HashMap<String, Object>();
        map4.put("name", "Ake");
        map4.put("color", "red");
        map4.put("size", 22);
        result.add(map4);

        System.out.println(map4);

        HashMap<String, Object> map5 = new HashMap<String, Object>();
        map5.put("name", "Alex");
        map5.put("color", "blue");
        map5.put("size", 34);
        result.add(map5);

        System.out.println(map5);

        HashMap<String, Object> map6 = new HashMap<String, Object>();
        map6.put("name", "John");
        map6.put("color", "red");
        map6.put("size", 24);
        result.add(map6);

        System.out.println(map6);

        HashMap<String, Object> map7 = new HashMap<String, Object>();
        map7.put("name", "Adward");
        map7.put("color", "blue");
        map7.put("size", 33);
        result.add(map7);

        System.out.println(map7);

        HashMap<String, Object> map8 = new HashMap<String, Object>();
        map8.put("name", "William");
        map8.put("color", "red");
        map8.put("size", 22);
        result.add(map8);

        System.out.println(map8);

        HashMap<String, Object> map9 = new HashMap<String, Object>();
        map9.put("name", "Michael");
        map9.put("color", "blue");
        map9.put("size", 34);
        result.add(map9);

        System.out.println(map9);

        HashMap<String, Object> map10 = new HashMap<String, Object>();
        map10.put("name", "Sophia");
        map10.put("color", "green");
        map10.put("size", 43);
        result.add(map10);

        System.out.println(map10);

        Collections.sort(result, new Comparator<Map<String, Object>>() {

            @Override
            public int compare(Map<String, Object> o1, Map<String, Object> o2) {
                String color1 = (String) o1.get("color");
                String color2 = (String) o2.get("color");
                return color1.compareTo(color2);

            }

        });

    }
}

您的 Comparator 从地图中提取颜色并简单地比较它们,如您所见,这是按字典顺序进行的。解决此类问题的一种方法是为每种颜色分配一个数值:

Collections.sort(result, new Comparator<Map<String, Object>>() {

    @Override
    public int compare(Map<String, Object> o1, Map<String, Object> o2) {
        return Integer.compare(getMapScore(o1), getMapScore(o2));
    }

    private int getMapScore(Map<String, Object> map) {
        final String color = ((String) map.get("color")).toLowerCase();
        switch (color) {
            case "red":
                return 0;
            case "blue":
                return 1;
        }
        return 2;
    }
});

您可以使用枚举来定义顺序

private static enum Order{
    red(10),
    blue(9),
    green(8),
    Pink(7),
    yellow(6),
    black(5);

   int val;
    Order(int p) {
      val = p;
   }
   int getVal() {
      return val;
   } 
}

然后修改为Comparator如下:

    Collections.sort(result, new Comparator<Map<String, Object>>() {

        @Override
        public int compare(Map<String, Object> o1, Map<String, Object> o2) {
            String color1 = (String) o1.get("color");
            String color2 = (String) o2.get("color");
            return Order.valueOf(color1).getVal()-Order.valueOf(color2).getVal();  
        }

    });

我认为最好的方法是对颜色使用枚举,这样它就可以按照任何预定义的顺序进行排序,而且您不必担心在 compare 方法中添加更多条件。查看以下代码了解更多信息。

您可以按照您想要的顺序将颜色放入枚举中,然后将根据该顺序进行排序。不再需要 if else 条件。

导入java.util.*;

    public class Test {

        public enum Colors {
            RED, BLUE, BLACK, YELLOW, PINK, GREEN
        }

        public static void main(String[] args) {
            List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();

            HashMap<String, Object> map1 = new HashMap<String, Object>();
            map1.put("name", "John");
            map1.put("color", Colors.BLACK);
            map1.put("size", 24);
            result.add(map1);


            HashMap<String, Object> map2 = new HashMap<String, Object>();
            map2.put("name", "Liam");
            map2.put("color", Colors.YELLOW);
            map2.put("size", 44);
            result.add(map2);


            HashMap<String, Object> map3 = new HashMap<String, Object>();
            map3.put("name", "Noah");
            map3.put("color", Colors.PINK);
            map3.put("size", 43);
            result.add(map3);


            HashMap<String, Object> map4 = new HashMap<String, Object>();
            map4.put("name", "Ake");
            map4.put("color", Colors.RED);
            map4.put("size", 22);
            result.add(map4);


            HashMap<String, Object> map5 = new HashMap<String, Object>();
            map5.put("name", "Alex");
            map5.put("color", Colors.BLUE);
            map5.put("size", 34);
            result.add(map5);


            HashMap<String, Object> map6 = new HashMap<String, Object>();
            map6.put("name", "John");
            map6.put("color", Colors.RED);
            map6.put("size", 24);
            result.add(map6);


            HashMap<String, Object> map7 = new HashMap<String, Object>();
            map7.put("name", "Adward");
            map7.put("color", Colors.BLUE);
            map7.put("size", 33);
            result.add(map7);


            HashMap<String, Object> map8 = new HashMap<String, Object>();
            map8.put("name", "William");
            map8.put("color", Colors.RED);
            map8.put("size", 22);
            result.add(map8);


            HashMap<String, Object> map9 = new HashMap<String, Object>();
            map9.put("name", "Michael");
            map9.put("color", Colors.RED);
            map9.put("size", 34);
            result.add(map9);


            HashMap<String, Object> map10 = new HashMap<String, Object>();
            map10.put("name", "Sophia");
            map10.put("color", Colors.GREEN);
            map10.put("size", 43);
            result.add(map10);


            Collections.sort(result, new Comparator<Map<String, Object>>() {

                @Override
                public int compare(Map<String, Object> o1, Map<String, Object> o2) {
                    Colors color1 = (Colors) o1.get("color");
                    Colors color2 = (Colors) o2.get("color");
                    return color1.compareTo(color2);

                }

            });

            System.out.println(result);

        }
    }