【问题标题】:How to Process a ArrayList in JAVA?如何在 JAVA 中处理 ArrayList?
【发布时间】:2026-01-23 20:40:01
【问题描述】:

我已经创建了一个数组列表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
      }
    ]
  }
]

【问题讨论】:

  • 相似时间戳的值”是什么意思?您想检查 same 时间戳的所有值吗?你的预期输出是什么?请给我们看!顺便说一句,还请提供一个更清晰的示例,因为您输入的 JSON 字符串中的所有值都是 1。
  • 您要检查所有 jsobobjects 中的所有时间戳并返回 1 还是 0?或者您想一次检查一个对象的所有时间戳?
  • @LHCHIN 是的。我想检查同一时间戳的所有值。我已经编辑了问题并添加了预期的结果。希望现在很清楚。谢谢:)
  • @VinitPillai - 您好,感谢您的回复。我已经编辑了问题并添加了预期的结果。希望现在很清楚。真的很抱歉造成混乱。 :)

标签: java json arraylist timestamp


【解决方案1】:

直接的方法是将输入的 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());
            }
        });
    });
});

第 4 步
生成用于序列化的聚合对象。

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));

【讨论】:

  • @Knight95 如果我的解决方案对您有帮助,请告诉我,谢谢!