最近做到一个需求,需要把业务侧返回的数据(格式为List<JSONObject>),然后根据前端传来的排序字段、以及升降序属性来排序并返回给前端。要对List<JSONObject>中的多个属性字段进行动态的升序或降序排序,我们可以根据需要使用Comparator.comparing()方法和Comparator.reverseOrder()方法,运用lambda表达式动态指定属性字段和排序顺序。以下是自己写的一个示例代码,演示了如何实现动态的降序和升序排序,仅供参考。
java
public static void main(String[] args) {
List<JSONObject> jsonList = new ArrayList<>();
// 添加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<String> sortProperties = new ArrayList<>();
//动态指定要排序的属性字段
//此处可以根据业务需要传具体字段,此处测试就先写死
sortProperties.add("name");
sortProperties.add("age");
Map<String,Boolean> sortOrders = new HashMap<>();
//动态指定属性字段对应的排序顺序(true表示降序,false表示升序)
//此处可以根据业务传具体字段的具体排序方式,此处测试就先写死
sortOrders.put("name",false);
sortOrders.put("age",true);
// 构建Comparator链
Comparator<JSONObject> comparator = null;
for (int i = 0; i < sortProperties.size(); i++) {
final int propertyIndex = i;
Comparator<JSONObject> propertyComparator = Comparator.comparing(
(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());
}
}
按名字升序,按年龄降序
输出结果:
java
{"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()等其它方法。