简体   繁体   English

在颜色之后对数组列表进行排序

[英]sort arraylist after the color

I have a ArrayList of Map<String, object> and I want to sort the list after the color so that the red maps are on the top in the ArrayList , immediately afterward the blue maps and at the end the other colors.我有一个Map<String, object>ArrayList ,我想在颜色之后对列表进行排序,以便红色地图在ArrayList的顶部,紧接着是蓝色地图,最后是其他颜色。 Currently I am getting the ArrayList sorted alphabetically.目前我正在按字母顺序排列ArrayList How can I get the maps in the ArrayList sorted as I want?如何让ArrayList的地图按我的意愿排序?

Code:代码:

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);

            }

        });

    }
}

Your Comparator extracts the colors from the maps and simply compares them, which, as you've seen, does so lexicographically.您的Comparator从地图中提取颜色并简单地比较它们,正如您所见,这是按字典顺序进行的。 One way to approach such a problem could be assign a numeric value to each color:解决此类问题的一种方法是为每种颜色分配一个数值:

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;
    }
});

You could use enum to define the order您可以使用枚举来定义订单

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;
   } 
}

Then modify to Comparator as follows:然后修改为 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();  
        }

    });

I think the best way would be use Enum for colors so that it can be sorted in any predefined order and you don't have to worry about adding more condition in the compare method.我认为最好的方法是将 Enum 用于颜色,以便它可以按任何预定义的顺序排序,并且您不必担心在compare方法中添加更多条件。 check the below code for more info.检查以下代码以获取更多信息。

You can put the colors in enums in the order you want and that will be sorted according to that.您可以按照您想要的顺序将颜色放入枚举中,然后将根据该顺序进行排序。 No more if else condition required.如果需要其他条件,则不再需要。

import java.util.*;导入 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);

        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM