最近做到一个需求,需要把业务侧返回的数据(格式为List
public static void main(String[] args) {
List
// 添加JSONObject对象到List中
JSONObject json1 = new JSONObject();
json1.put("id", 1);
json1.put("name", "Alice");
json1.put("age", 25);
JSONObject json2 = new JSONObject();
json2.put("id", 2);
json2.put("name", "Alice");
json2.put("age", 30);
JSONObject json3 = new JSONObject();
json3.put("id", 3);
json3.put("name", "Bob");
json3.put("age", 20);
jsonList.add(json1);
jsonList.add(json2);
jsonList.add(json3);
List
//动态指定要排序的属性字段
//此处可以根据业务需要传具体字段,此处测试就先写死
sortProperties.add("name");
sortProperties.add("age");
Map
//动态指定属性字段对应的排序顺序(true表示降序,false表示升序)
//此处可以根据业务传具体字段的具体排序方式,此处测试就先写死
sortOrders.put("name",false);
sortOrders.put("age",true);
// 构建Comparator链
Comparator
for (int i = 0; i < sortProperties.size(); i++) {
final int propertyIndex = i;
Comparator
(JSONObject o) -> o.getString(sortProperties.get(propertyIndex)),
String.CASE_INSENSITIVE_ORDER
);
if (sortOrders.get(sortProperties.get(propertyIndex))) {
propertyComparator = propertyComparator.reversed();
}
if (comparator == null) {
comparator = propertyComparator;
} else {
comparator = comparator.thenComparing(propertyComparator);
}
}
Collections.sort(jsonList, comparator);
// 输出排序后的结果
for (JSONObject json : jsonList) {
System.out.println(json.toString());
}
}
按名字升序,按年龄降序
输出结果:
{"name":"Alice","id":2,"age":30}
{"name":"Alice","id":1,"age":25}
{"name":"Bob","id":3,"age":20}
在上述代码中,首先创建了一个包含多个JSONObject对象的List。然后,使用sortProperties来动态指定要排序的属性字段,使用sortOrders来动态指定属性字段对应的排序顺序。
在使用for循环遍历sortProperties列表中的属性字段,并根据属性字段在列表中的索引创建一个新的Comparator。在Lambda表达式中,通过o.get(sortProperties.get(propertyIndex))来获取属性字段的值。根据sortOrders列表中的值,如果需要降序排序则使用.reversed()方法进行反转。
通过循环构建的多个Comparator通过thenComparing方法链将它们连接在一起,生成一个能够实现多个属性字段动态排序的Comparator。
注意:上述代码中假设属性字段具有相同的类型。如果属性字段有不同的数据类型,可能需要使用适当的比较器来提取和比较属性字段的值,即要注意从jsonObject中取对应值的时候,是使用getString()还是getInteger()等其它方法。
参考阅读
发表评论