Java 排序列表<;地图<;字符串,对象>&燃气轮机;基于价值

Java 排序列表<;地图<;字符串,对象>&燃气轮机;基于价值,java,sorting,collections,comparator,comparable,Java,Sorting,Collections,Comparator,Comparable,基本上我有一个列表,我想根据地图中某个键的值对其进行排序 问题是我不知道它的类型。。。此映射可以包含字符串、整数、双精度、浮点等。。。。我想把它分类: 到目前为止 List<Map<String,Object>> data = getResults(); Collections.sort(data, (o1, o2) -> (String.valueOf(o2.get("Field1"))) .compareTo((S

基本上我有一个
列表
,我想根据地图中某个键的值对其进行排序

问题是我不知道它的类型。。。此映射可以包含字符串、整数、双精度、浮点等。。。。我想把它分类:

到目前为止

List<Map<String,Object>> data = getResults();
Collections.sort(data, (o1, o2) -> (String.valueOf(o2.get("Field1")))
              .compareTo((String.valueOf(o1.get("Field1")))));
List data=getResults();
Collections.sort(数据,(o1,o2)->(String.valueOf(o2.get(“Field1”)))
.compareTo((String.valueOf(o1.get(“Field1”)));
这不是一个好主意,因为数字没有正确排序。。。。 如何处理这个问题?

您可以通过比较双精度值来概括比较数字,因为它们是最大的。如果两个对象无法转换为数字,并且无法从这些对象中解析双精度值,则比较它们的字符串值:

List data=Arrays.asList(
地图(“Field1”,21.2d),//Double
Map.of(“Field1”,“qqq”),//字符串
映射(“Field1”,“22.5”),//字符串
Map.of(“Field1”,2),//整数
地图(“Field1”,3L),//长
地图(第1区,23.1f));//浮动
data.sort(Comparator.comparingDouble((Map)映射)->{
Object=map.get(“Field1”);
if(对象实例的编号){
返回((Number)对象).doubleValue();
}否则{
试一试{
返回Double.parseDouble(String.valueOf(object));
}捕获(数字格式){
返回Double.NaN;
}
}
}).然后比较(map->String.valueOf(map.get(“Field1”));
data.forEach(System.out::println);
//{Field1=2}
//{Field1=3}
//{Field1=21.2}
//{Field1=22.5}
//{Field1=23.1}
//{Field1=qqq}


另请参见:

我认为地图中的值都应该是可比较的实例,因此类似的东西可能会起作用。此解决方案可能比公认的答案更好,因为您可以将自己的类作为值(例如实现Comparable的MyClass)

List data=getResults();
集合.排序(数据,(o1,o2)->{
对象v1=o1.get(“Field1”);
对象v2=o2.get(“Field1”);
if(可比的v1实例){
//如果v1和v2不匹配,则可能引发异常
//相同类型,如双比较字符串
回报率((可比)v1)。与((可比)v2)相比;
}否则{
返回String.valueOf(v1).compareTo(String.valueOf(v2));
}
});