Java 计算一个JSONArray有多少特定JSONObject

Java 计算一个JSONArray有多少特定JSONObject,java,arrays,json,for-loop,Java,Arrays,Json,For Loop,我正在尝试获取JSONArray的JSONObject数。 我的JSONArray就像 varArray:[{“value1_1_1”:0},{“value1_2_2”:0},{“value1_4_1”:0},{“value1_5_3”:0}, 0},{0 0},{0 0 0},{0 0 0},{0 0},{,{0 0 0 0 0},{{“1 0 0 0 0 0 0 0 0 0 0 0 0},{“1 0 0 0 0 0 0 0 0},{“1 0 0 0 0 0 0 0 0},,{“1 0 0 0

我正在尝试获取JSONArray的JSONObject数。 我的JSONArray就像

varArray:[{“value1_1_1”:0},{“value1_2_2”:0},{“value1_4_1”:0},{“value1_5_3”:0},
0},{0 0},{0 0 0},{0 0 0},{0 0},{,{0 0 0 0 0},{{“1 0 0 0 0 0 0 0 0 0 0 0 0},{“1 0 0 0 0 0 0 0 0},{“1 0 0 0 0 0 0 0 0},,{“1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0},,{,”0 0 0 0 0 0 0 0 0 0 0 0{,,{,”0 0 0 0 0 0 0 0 0 0 0 0},,,,,,{,,{,”0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0{,,,,,,,,,,,,,,,,,,,,,,{,”0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,,,,,,,,,,,,,,,,,{:0},{“value1_4_2”:0},{“value1_8_6”:0},{“value1_8_6”:0},{“value1_10_5”:0},{“value1_10_5”:0}

我想用JSONObject的编号替换这些“0”。期望的结果是

varArray:[{“value1_1_1”:3},{“value1_2_2”:1},{“value1_4_1”:2},{“value1_5_3”:1},
{“value1_8_3”:1},{“value1_1_9”:1},{“value1_2_6”:3},{“value1_5:1”:1},{“value1_8:u 9”:1},{“value1_3:u 5”:2},{“value1_4:u 2”:2},{“value1_8:u 6”:2},{“value1_10:u 5”:2}

我尝试了下面的方法,但失败了

    JSONArray newArray = new JSONArray();
    for(int i=0;i<varArray.size();i++){

            JSONObject jsonFromArr = varArray.getJSONObject(i);


            for(int a=1;a<=order1Max;a++){
                for(int b=1;b<=order2Max;b++){
                    for(int c=1;c<=valueMax;c++){
                        if(jsonFromArr.get("value"+a+"_"+b+"_"+c) != null){
                            jsonArrayList.add(jsonFromArr.toString());

                            if(!newArray.contains(jsonFromArr)){
                                newArray.add(jsonFromArr);

                            } else{
                                // I can't figure out what to do here.
                            }
                        }
                    }
                }
            }
        }
JSONArray newArray=newjsonarray();

对于(int i=0;i一种简单的方法是将给定的json数组转换为
Map
,表示
countMap
。然后将
countMap
转换为json对象

public static void main(String[] args) {
    String jsonStr = "[{\"value1_1_1\":0},{\"value1_2_2\":0},{\"value1_4_1\":0},{\"value1_5_3\":0},{\"value1_8_3\":0},{\"value1_1_9\":0},{\"value1_2_6\":0},{\"value1_4_1\":0},{\"value1_5_7\":0},{\"value1_8_9\":0},{\"value1_1_1\":0},{\"value1_1_1\":0},{\"value1_2_6\":0},{\"value1_2_6\":0},{\"value1_3_5\":0},{\"value1_3_5\":0},{\"value1_4_2\":0},{\"value1_4_2\":0},{\"value1_8_6\":0},{\"value1_8_6\":0},{\"value1_10_5\":0},{\"value1_10_5\":0}]";

    Map<String, Integer> countMap = new HashMap<>();
    JSONArray jsonArray = new JSONArray(jsonStr);
    for (int i = 0; i < jsonArray.length(); i++) {
        String name = JSONObject.getNames(jsonArray.getJSONObject(i))[0];
        if (countMap.containsKey(name)) {
            countMap.put(name, countMap.get(name)+1);
        } else {
            countMap.put(name, 1);
        }
     }
     System.out.println(countMap.toString());

     JSONArray jsonArrayNew = new JSONArray();
     countMap.forEach((k, v) -> {
         JSONObject jsonObj = new JSONObject();
         jsonArrayNew.put(jsonObj.put(k, v));
     });
     System.out.println(jsonStrNew.toString());
}

您需要的是计算唯一键valueX_Y_Z的出现次数。 这可以使用Java8流作为for循环的替代方法来完成

public static void main(String[] args) {
    String json = "[{\"value1_1_1\":0},{\"value1_2_2\":0},{\"value1_4_1\":0},{\"value1_5_3\":0},{\"value1_8_3\":0},{\"value1_1_9\":0},{\"value1_2_6\":0},{\"value1_4_1\":0},{\"value1_5_7\":0},{\"value1_8_9\":0},{\"value1_1_1\":0},{\"value1_1_1\":0},{\"value1_2_6\":0},{\"value1_2_6\":0},{\"value1_3_5\":0},{\"value1_3_5\":0},{\"value1_4_2\":0},{\"value1_4_2\":0},{\"value1_8_6\":0},{\"value1_8_6\":0},{\"value1_10_5\":0},{\"value1_10_5\":0}]";

    JSONArray jsonArray = new JSONArray(json);

    List<JSONObject> jsonObjects = arrayToStream(jsonArray)
            .map(JSONObject.class::cast)
            // get a stream of valuex_y_z
            .map(jo -> JSONObject.getNames(jo)[0]) 
            // collect into a Map<String, Long>, each key is a unique "valuex_y_z"
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) 
            // stream map entries
            .entrySet().stream()
            // build a stream of JSONObject
            .map(e -> new JSONObject().put(e.getKey(), e.getValue()))
            // collect to a list
            .collect(Collectors.toList());

    // build new JSONArray 
    JSONArray jsonArrayGroupBy = new JSONArray(jsonObjects);

    System.out.println(jsonArrayGroupBy.toString());
}

private static Stream<Object> arrayToStream(JSONArray array) {
    return StreamSupport.stream(array.spliterator(), false);
}
publicstaticvoidmain(字符串[]args){
3.0},,{0 0 0 0},,,{0 0 0 0 0},,,{00 0 0 0},,{00 0 0 0 0},,{00 0 0 0 0 0 0 0},,,,{00 0 0 0 0 0 0 0 0 0},,,,{00 0 0 0 0 0 0},,,,{00 0 0 0 0},,,,,,{00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0},,,,{00 0 0 0 0 0 0 0 0 0},,,,,,,00 0 0 0 0 0 0 0 0 0 0 0,,,,,,,,{00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,,,,,,,,,,,,,,,,,,,,,,,{00 0 0 0 0 0 0 0 0 0 0 0,,,,,,,,,,,,U1_1\':0}、{“value1_1\':0}、{“value1_2_6\':0}、{“value1_2_6\':0}、{“value1_3_5\':0}、{“value1_3_5\':0}、{“value1_4_2\':0}、{”value1_4_2\':0}、{\'value1_8_6\':0}、{\'value1_8_6\':0}、{\'value1_10_5\':0}、{\'value1_10_5\'”;
JSONArray JSONArray=新JSONArray(json);
列表jsonObjects=arrayToStream(jsonArray)
.map(JSONObject.class::cast)
//获取一个valuex_y_z流
.map(jo->JSONObject.getNames(jo)[0])
//收集到地图中,每个键都是唯一的“valuex_y_z”
.collect(Collectors.groupingBy(Function.identity()、Collectors.counting())
//流映射条目
.entrySet().stream()
//构建JSONObject流
.map(e->new JSONObject().put(e.getKey(),e.getValue())
//收集到一份清单
.collect(Collectors.toList());
//构建新的JSONArray
JSONArray jsonArrayGroupBy=新的JSONArray(JSONObject);
System.out.println(jsonArrayGroupBy.toString());
}
私有静态流arrayToStream(JSONArray数组){
返回StreamSupport.stream(array.spliterator(),false);
}

我会使用一个简单的
地图
@Yoojin Kim你能把你的全部代码粘贴到这里吗?我想在本地运行并对其进行更改。
{value1_8_6=2, value1_8_9=1, value1_4_2=2, value1_5_3=1, value1_2_6=3, value1_3_5=2, value1_1_9=1, value1_8_3=1, value1_5_7=1, value1_1_1=3, value1_2_2=1, value1_4_1=2, value1_10_5=2}
[{"value1_10_5":2},{"value1_1_1":3},{"value1_1_9":1},{"value1_2_2":1},{"value1_2_6":3},{"value1_3_5":2},{"value1_4_1":2},{"value1_4_2":2},{"value1_5_3":1},{"value1_5_7":1},{"value1_8_3":1},{"value1_8_6":2},{"value1_8_9":1}]
public static void main(String[] args) {
    String json = "[{\"value1_1_1\":0},{\"value1_2_2\":0},{\"value1_4_1\":0},{\"value1_5_3\":0},{\"value1_8_3\":0},{\"value1_1_9\":0},{\"value1_2_6\":0},{\"value1_4_1\":0},{\"value1_5_7\":0},{\"value1_8_9\":0},{\"value1_1_1\":0},{\"value1_1_1\":0},{\"value1_2_6\":0},{\"value1_2_6\":0},{\"value1_3_5\":0},{\"value1_3_5\":0},{\"value1_4_2\":0},{\"value1_4_2\":0},{\"value1_8_6\":0},{\"value1_8_6\":0},{\"value1_10_5\":0},{\"value1_10_5\":0}]";

    JSONArray jsonArray = new JSONArray(json);

    List<JSONObject> jsonObjects = arrayToStream(jsonArray)
            .map(JSONObject.class::cast)
            // get a stream of valuex_y_z
            .map(jo -> JSONObject.getNames(jo)[0]) 
            // collect into a Map<String, Long>, each key is a unique "valuex_y_z"
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) 
            // stream map entries
            .entrySet().stream()
            // build a stream of JSONObject
            .map(e -> new JSONObject().put(e.getKey(), e.getValue()))
            // collect to a list
            .collect(Collectors.toList());

    // build new JSONArray 
    JSONArray jsonArrayGroupBy = new JSONArray(jsonObjects);

    System.out.println(jsonArrayGroupBy.toString());
}

private static Stream<Object> arrayToStream(JSONArray array) {
    return StreamSupport.stream(array.spliterator(), false);
}