HashMap是无序的,不要用HashMap,使用TreeMap默认按照升序排列,想要降序改为下面这样
Map<String, String> map = new TreeMap<String, String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
JSONObject案例:
//Treemap 默认按照升序排列
Map<String, String> map = new TreeMap<String, String>();
map.put("plant-2", "wnba");
map.put("plant-3", "nba");
map.put("plant-5", "cba");
map.put("plant-11", "aaa");
map.put("plant-22", "aaa");
map.put("plant-12", "aaa");
//将map中的值放入JsonObject中,添加个plantName字段再将其放入list中
List<JSONObject> list = new ArrayList<>();
Set<String> strings = map.keySet();
strings.forEach(x->{
JSONObject jsonObject = new JSONObject(true);
jsonObject.put("list",map.get(x));
jsonObject.put("plantName",x);
list.add(jsonObject);
});
list.forEach(x->{
System.out.println(x.toJSONString());
});
可以看到输出是比较乱的,直接用TreeMap进行排序就不行了
{"list":"aaa","plantName":"plant-11"}
{"list":"aaa","plantName":"plant-12"}
{"list":"wnba","plantName":"plant-2"}
{"list":"aaa","plantName":"plant-22"}
{"list":"nba","plantName":"plant-3"}
{"list":"cba","plantName":"plant-5"}
原因:
点到compareTo源码(返回-1的话,第一个参数排前面)中可以看到,它是先减法,如果都一样再判断长度,plant-11中的’1’比plant-2中的’2’ASCII码小,直接返回-1,所以plant-11就被拍到前面了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HhbyC20g-1628317765543)(en-resource://database/523:1)]
修改办法自定义排序:先判断长度再进行减法
使用以下方式对list中的JSONObject进行key排序
//修改排序规则先按照长度再按照char比较
Collections.sort(list, new Comparator<JSONObject>() {
@Override
public int compare(JSONObject o1, JSONObject o2) {
String o11 = (String)o1.get("plantName");
String o22 = (String)o2.get("plantName");
if (o11.length() < o22.length()){
return -1;
}if (o11.length() == o22.length()){
return o11.compareTo(o22);
}else return 1;
}
});
可以看到以下结果:
{"list":"wnba","plantName":"plant-2"}
{"list":"nba","plantName":"plant-3"}
{"list":"cba","plantName":"plant-5"}
{"list":"aaa","plantName":"plant-11"}
{"list":"aaa","plantName":"plant-12"}
{"list":"aaa","plantName":"plant-22"}
这种方式将上面的TreeMap改为HashMap都可以排序