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;
}
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With