基于公共数字分组JSONArray元素,创建分组数组遇实现问题
搞定JSONArray按公共数字分组的问题
嘿,我猜你应该是在用Java的org.json.JSONArray处理数据吧?从你描述的情况来看,大概率是循环里踩了「复用同一个数组对象」或者「分组匹配逻辑出错」的坑,导致没法生成独立的分组数组。下面给你一个清晰的解决思路和可运行的代码示例:
核心思路
用一个Map来做分组映射:键是你说的「公共数字」(比如1对应ONES,2对应TWO),值是对应分组的独立JSONArray。遍历原数组时,把每个元素分配到对应键的数组里——如果该分组还不存在,就新建一个JSONArray,这样每个分组都是完全独立的。
完整代码示例
import org.json.JSONArray; import org.json.JSONObject; import java.util.HashMap; import java.util.Map; public class JSONGroupingFix { public static void main(String[] args) { // 模拟你的原始目标数组 JSONArray originalArray = new JSONArray(); // 加入6个ONES元素(假设元素是带type字段的JSONObject,你可以根据实际结构调整) for (int i = 0; i < 6; i++) { originalArray.put(new JSONObject().put("type", "ONES")); } // 加入1个TWO和1个THREE originalArray.put(new JSONObject().put("type", "TWO")); originalArray.put(new JSONObject().put("type", "THREE")); // 1. 创建分组映射表,确保每个分组是独立数组 Map<Integer, JSONArray> groupedArrays = new HashMap<>(); // 2. 遍历原数组完成分组 for (int idx = 0; idx < originalArray.length(); idx++) { JSONObject currentElem = originalArray.getJSONObject(idx); String elemType = currentElem.getString("type"); Integer groupNum = null; // 匹配元素对应的公共数字 switch (elemType) { case "ONES": groupNum = 1; break; case "TWO": groupNum = 2; break; case "THREE": groupNum = 3; break; default: // 处理未知类型,比如跳过或者放到默认分组 continue; } // 分组不存在就新建,避免复用同一个数组 if (!groupedArrays.containsKey(groupNum)) { groupedArrays.put(groupNum, new JSONArray()); } // 将元素加入对应分组 groupedArrays.get(groupNum).put(currentElem); } // 3. 提取各个独立分组数组 JSONArray onesGroup = groupedArrays.get(1); JSONArray twoGroup = groupedArrays.get(2); JSONArray threeGroup = groupedArrays.get(3); // 验证结果 System.out.println("ONES分组元素数量:" + onesGroup.length()); // 输出6 System.out.println("TWO分组元素数量:" + twoGroup.length()); // 输出1 System.out.println("THREE分组元素数量:" + threeGroup.length()); // 输出1 } }
你之前可能踩的坑
- 复用同一个数组对象:比如你在循环里只创建了一个
JSONArray,每次分组都往里面塞元素,最后所有分组都指向同一个数组,数据全混在一起。解决办法就是每个分组都要单独新建JSONArray。 - 分组匹配逻辑错误:比如判断元素类型时的条件写错,导致元素没分到正确的组里。用
switch或者明确的if-else可以避免这个问题。 - 空指针风险:如果某个分组没有元素,直接调用
get会返回null,所以最好先判断containsKey再获取。
如果你的元素结构不是带type字段的JSONObject(比如是纯字符串),只需要调整「匹配公共数字」的逻辑就行,核心的分组思路是通用的。
内容的提问来源于stack exchange,提问作者Karthikeyan
相关产品推荐
相关产品推荐

