简体   繁体   中英

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. Currently I am getting the ArrayList sorted alphabetically. How can I get the maps in the ArrayList sorted as I want?

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. 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:

    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. 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.*;

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

        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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