【问题标题】:Counting how many certain JSONObjects a JSONArray has计算一个 JSONArray 有多少特定的 JSONObjects
【发布时间】:2019-09-11 07:25:03
【问题描述】:

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

varArray: [{"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}];

我想用 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_7":1},{"value1_8_9":1},{"value1_3_5":2},{"value1_4_2":2},{"value1_8_6":2},{"value1_10_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.
                            }
                        }
                    }
                }
            }
        }

我认为结果应该计入循环,因为 JSONObject 的键是动态的。如何获得我想要的结果?

---已编辑

完整代码(替换一些必须搜索数据库的部分)

JSONArray varArray = [{"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 newArray = new JSONArray();
for(int i=0;i<varArray.size();i++){
    JSONObject jsonFromArr = varArray.getJSONObject(i);
    for(int a=1;a<=1;a++){
        for(int b=1;b<=10;b++){
            for(int c=1;c<=9;c++){
                if(jsonFromArr.get("value"+a+"_"+b+"_"+c) != null){
                    if(!newArray.contains(jsonFromArr)){
                       newArray.add(jsonFromArr);
                    } else{
                        // I can't figure out what to do here.
                    }
                }
            }
        }
    }
}

【问题讨论】:

  • 我会用一个简单的Map&lt;String, int&gt;
  • @Yoojin Kim 你能把你的整个代码贴在这里吗?我想在本地运行它并对其进行更改。

标签: java arrays json for-loop


【解决方案1】:

一种简单的方法是将给定的 json 数组转换为Map&lt;String, Integer&gt;,如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());
}

控制台输出:

{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}]

【讨论】:

    【解决方案2】:

    您想要的是计算唯一键 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多