基于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)); }
说明
- 核心修改:把字符串比较改为数值类型比较,确保排序逻辑符合数值大小的预期
- 异常处理:覆盖了
JSONException(字段不存在)和NumberFormatException(格式错误)的情况,避免程序崩溃 - 排序方向:当前是升序排序,若需要降序,只需把
Double.compare(valA, valB)改为Double.compare(valB, valA)
内容的提问来源于stack exchange,提问作者SSMD
相关产品推荐
相关产品推荐

