Java 计算一个JSONArray有多少特定JSONObject
我正在尝试获取JSONArray的JSONObject数。 我的JSONArray就像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
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);
}