Как обработать ArrayList в JAVA? - PullRequest
1 голос
/ 03 февраля 2020

Я сделал 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
      }
    ]
  }
]

1 Ответ

1 голос
/ 05 февраля 2020

Прямой способ - преобразовать входную строку JSON во вложенные объекты, затем проверить все значения поля timestamp и сохранить результат в Map. Наконец, сгенерируйте объекты для вывода следующим образом:

Шаг 1
Создание вложенных POJO для десериализации и сериализации из / в JSON строки.

class Root {
    private List<Item> items;
    //general getters and setter
}

@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 setter
}

class DataPoint {
    private int value;
    private Timestamp timestamp;
    //general getters and setter
}

Шаг 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));
...