[英]How to Process a ArrayList in JAVA?
我做了一個 arraylist type - JSONObject
。 現在我想做的是,正如你所看到的,有類似的時間戳。 我想獲取類似時間戳的值並檢查所有值是否為 1。如果是,則將輸出為 1。否則為 0。
並對所有時間戳執行相同的操作並生成包含所有時間戳的 JSON。
[
{
"items": [
{
"unit": "up/down",
"datapoints": [
{
"value": 1,
"timestamp": 1580445000000
},
{
"value": 1,
"timestamp": 1580445060000
},
{
"value": 1,
"timestamp": 1580445120000
},
{
"value": 1,
"timestamp": 1580445180000
},
{
"value": 1,
"timestamp": 1580445240000
},
{
"value": 1,
"timestamp": 1580445300000
},
{
"value": 1,
"timestamp": 1580445360000
},
{
"value": 1,
"timestamp": 1580445420000
},
{
"value": 1,
"timestamp": 1580445480000
},
{
"value": 0,
"timestamp": 1580445540000
}
],
"isString": false,
"externalId": "3D_Uptime_Rate",
"id": 4924875616701448,
"isStep": true
}
]
},
{
"items": [
{
"unit": "up/down",
"datapoints": [
{
"value": 1,
"timestamp": 1580445000000
},
{
"value": 1,
"timestamp": 1580445060000
},
{
"value": 1,
"timestamp": 1580445120000
},
{
"value": 1,
"timestamp": 1580445180000
},
{
"value": 1,
"timestamp": 1580445240000
},
{
"value": 1,
"timestamp": 1580445300000
},
{
"value": 1,
"timestamp": 1580445360000
},
{
"value": 1,
"timestamp": 1580445420000
},
{
"value": 1,
"timestamp": 1580445480000
},
{
"value": 1,
"timestamp": 1580445540000
}
],
"isString": false,
"externalId": "3D1",
"id": 4924875616701448,
"isStep": true
}
]
},
{
"items": [
{
"unit": "up/down",
"datapoints": [
{
"value": 1,
"timestamp": 1580445000000
},
{
"value": 0,
"timestamp": 1580445060000
},
{
"value": 1,
"timestamp": 1580445120000
},
{
"value": 0,
"timestamp": 1580445180000
},
{
"value": 1,
"timestamp": 1580445240000
},
{
"value": 1,
"timestamp": 1580445300000
},
{
"value": 1,
"timestamp": 1580445360000
},
{
"value": 1,
"timestamp": 1580445420000
},
{
"value": 1,
"timestamp": 1580445480000
},
{
"value": 1,
"timestamp": 1580445540000
}
],
"isString": false,
"externalId": "3D2",
"id": 4924875616701448,
"isStep": true
}
]
}
]
無論如何,最后我想生成這樣的東西;
[
{
"items": [
{
"unit": "up/down",
"datapoints": [
{
"value": 1,
"timestamp": 1580445000000
},
{
"value": 0,
"timestamp": 1580445060000
},
{
"value": 1,
"timestamp": 1580445120000
},
{
"value": 0,
"timestamp": 1580445180000
},
{
"value": 1,
"timestamp": 1580445240000
},
{
"value": 1,
"timestamp": 1580445300000
},
{
"value": 1,
"timestamp": 1580445360000
},
{
"value": 1,
"timestamp": 1580445420000
},
{
"value": 1,
"timestamp": 1580445480000
},
{
"value": 0,
"timestamp": 1580445540000
}
],
"isString": false,
"externalId": "Union_Uptime",
"isStep": true
}
]
}
]
一種直接的方法是將輸入的 JSON 字符串轉換為嵌套對象,然后檢查timestamp
字段的所有值並將結果存儲到Map
。 最后,生成輸出對象如下:
第1步
為 JSON 字符串的反序列化和序列化創建嵌套的 POJO。
class Root {
private List<Item> items;
//general getters and setters
}
@JsonInclude(JsonInclude.Include.NON_NULL)
class Item {
private String unit;
private List<DataPoint> datapoints;
private boolean isString;
private String externalId;
private String id;
private boolean isStep;
//general getters and setters
}
class DataPoint {
private int value;
private Timestamp timestamp;
//general getters and setters
}
第2步
將 JSON 字符串反序列化為聲明的對象。
ObjectMapper mapper = new ObjectMapper();
List<Root> root = mapper.readValue(jsonStr, new TypeReference<List<Root>>(){});
第 3 步
創建一個Map
來存儲檢查的結果。
Map<Timestamp, Integer> dataPointMap = new HashMap<>();
root.forEach(e -> {
e.getItems().forEach(e1 -> {
e1.getDatapoints().forEach(e2 -> {
if (dataPointMap.containsKey(e2.getTimestamp())) {
if (dataPointMap.get(e2.getTimestamp()) != 0) {
dataPointMap.put(e2.getTimestamp(), e2.getValue());
}
} else {
dataPointMap.put(e2.getTimestamp(), e2.getValue());
}
});
});
});
第四步
生成聚合對象以進行序列化。
List<DataPoint> datapoints = new ArrayList<>();
dataPointMap.forEach((k,v) -> {
DataPoint dataPoint = new DataPoint();
dataPoint.setTimestamp(k);
dataPoint.setValue(v);
datapoints.add(dataPoint);
});
Item item = new Item();
item.setUnit("up/down");
item.setDatapoints(datapoints);
item.setIsString(false);
item.setExternalId("Union_Uptime");
item.setIsStep(true);
List<Item> items = new ArrayList<>();
items.add(item);
Root rootOut = new Root();
rootOut.setItems(items);
第 5 步
System.out.println(mapper.writeValueAsString(rootOut));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.