簡體   English   中英

如何在 JAVA 中處理 ArrayList?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM