在颜色之后对 arraylist 进行排序
sort arraylist after the color
我有一个 ArrayList
的 Map<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);
}
}
我有一个 ArrayList
的 Map<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);
}
}