假设您有一个JSON文件,其中包含关于用户的信息(包括他们的电子邮件(存储在String中)、评级(存储在int中)等等)。我的看起来是这样的:
{"data": [{"user": "trevor@mail.com", "rating": 3, "disabled": true},
{"user": "martin@mail.com", "rating": 14, "disabled": false},
{"user": "harry@mail.com", "rating": 14, "disabled": true},
{"user": "nevill@mail.com", "rating": 25, "disabled": true}]}目标是根据多个标准对此列表进行排序。排序条件也是JSON文件的一部分:
{"sort_by": ["rating", "user"]}在我们的例子中,列表应该先按等级排序,然后再按用户名排序(如果某些用户的等级相同)。
我已经从这两个列表创建了JSONArrays,并设法通过电子邮件对用户进行排序。我的sort()方法如下所示:
private void sort() {
JSONArray sortedJsonArray = new JSONArray();
List<JSONObject> jsonValues = new ArrayList<>();
for (int i = 0; i < data.length(); i++) {
jsonValues.add(data.getJSONObject(i));
}
Collections.sort(jsonValues, new Comparator<>() {
private String key = sort_by_array.get(0).toString();
@Override
public int compare(JSONObject a, JSONObject b) {
String valA = a.get(key).toString();
String valB = b.get(key).toString();
return valA.compareTo(valB);
}
});
for (int i = 0; i < data.length(); i++) {
sortedJsonArray.put(jsonValues.get(i));
}
data = sortedJsonArray;
}它适用于通过电子邮件进行排序,但不适用于按int值排序,即使我试图将它们转换为字符串。而且,它显然不适用于按多个标准进行排序。
,我应该修改代码中的哪些内容,以便它至少按照一个条件对列表进行正确的排序,这个条件可以是字符串/整数或布尔值?提前谢谢你。
发布于 2022-02-15 20:30:51
实现这样的比较器类:
class KeyComparator implements Comparator<JSONObject> {
private final String key;
public KeyComparator(String key) {
this.key = key;
}
@Override
public int compare(JSONObject o1, JSONObject o2) {
Comparable v1 = (Comparable) o1.get(key);
Comparable v2 = (Comparable) o2.get(key);
return v1.compareTo(v2);
}
}构建如下所示的复合比较器:
Comparator<JSONObject> comparator = new KeyComparator(sort_by_array.get(0).toString());
for (int i = 1; i < sort_by_array.size(); i++) {
comparator = comparator.thenComparing(new KeyComparator(sort_by_array.get(i).toString()));
}那么Collections.sort(jsonValues, comparator)应该是个不错的选择。
https://stackoverflow.com/questions/71131644
复制相似问题