首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Java按多个条件对JSONArray进行排序?

如何使用Java按多个条件对JSONArray进行排序?
EN

Stack Overflow用户
提问于 2022-02-15 18:31:41
回答 1查看 42关注 0票数 0

假设您有一个JSON文件,其中包含关于用户的信息(包括他们的电子邮件(存储在String中)、评级(存储在int中)等等)。我的看起来是这样的:

代码语言:javascript
复制
{"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文件的一部分:

代码语言:javascript
复制
{"sort_by": ["rating", "user"]}

在我们的例子中,列表应该先按等级排序,然后再按用户名排序(如果某些用户的等级相同)。

我已经从这两个列表创建了JSONArrays,并设法通过电子邮件对用户进行排序。我的sort()方法如下所示:

代码语言:javascript
复制
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值排序,即使我试图将它们转换为字符串。而且,它显然不适用于按多个标准进行排序。

,我应该修改代码中的哪些内容,以便它至少按照一个条件对列表进行正确的排序,这个条件可以是字符串/整数或布尔值?提前谢谢你。

EN

回答 1

Stack Overflow用户

发布于 2022-02-15 20:30:51

实现这样的比较器类:

代码语言:javascript
复制
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);
    }
}

构建如下所示的复合比较器:

代码语言:javascript
复制
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)应该是个不错的选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71131644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档