You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Average字段排序JSON数组无报错但失效问题求助

问题原因与解决方案

失效原因

你当前的排序逻辑是对Average字段的字符串进行字典序比较,而非按数值大小排序。字符串比较是逐字符对比ASCII码:

  • 比如"107.775"和"20.0",第一个字符'1'的ASCII码小于'2',所以会判定"107.775"更小,这和数值大小的逻辑完全不符,导致排序结果不符合预期。

解决方法

将Average字段的字符串值转换为数值类型(比如Double),再进行数值大小的比较,同时建议增加异常处理,避免因格式错误导致程序崩溃。

修改后的完整代码

JSONArray jsonArr = new JSONArray(array.toString());
JSONArray sortedJsonArray = new JSONArray();

List<JSONObject> jsonValues = new ArrayList<JSONObject>();
for (int i = 0; i < jsonArr.length(); i++) {
    jsonValues.add(jsonArr.getJSONObject(i));
}

Collections.sort(jsonValues, new Comparator<JSONObject>() {
    private static final String KEY_NAME = "Average";

    @Override
    public int compare(JSONObject a, JSONObject b) {
        try {
            // 将字符串转换为Double类型进行数值比较
            double valA = Double.parseDouble(a.getString(KEY_NAME));
            double valB = Double.parseDouble(b.getString(KEY_NAME));
            // 升序排序,若要降序则返回 Double.compare(valB, valA)
            return Double.compare(valA, valB);
        } catch (JSONException | NumberFormatException e) {
            // 处理转换失败的情况,这里默认按字符串字典序兜底,也可根据需求调整
            try {
                String strA = a.getString(KEY_NAME);
                String strB = b.getString(KEY_NAME);
                return strA.compareTo(strB);
            } catch (JSONException ex) {
                // 若字段不存在,默认把缺失字段的对象放到后面
                return 1;
            }
        }
    }
});

for (int i = 0; i < jsonValues.size(); i++) {
    sortedJsonArray.put(jsonValues.get(i));
}

说明

  1. 核心修改:把字符串比较改为数值类型比较,确保排序逻辑符合数值大小的预期
  2. 异常处理:覆盖了JSONException(字段不存在)和NumberFormatException(格式错误)的情况,避免程序崩溃
  3. 排序方向:当前是升序排序,若需要降序,只需把Double.compare(valA, valB)改为Double.compare(valB, valA)

内容的提问来源于stack exchange,提问作者SSMD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:50:40