Как извлечь список из списка? - PullRequest
2 голосов
/ 25 сентября 2019

У меня есть два ответа JSON, которые я должен объединить в один ответ.

Первый ответ JSON: (DTO2)

  "data1": [{
      "id": "ABC",
      "variables": [{
        "id": "XYZ",
        "name":"name",
        "description":"description"}]
    }]

  class A{
List <Data1> data1; 

class Data1 data1 {
....
List<Variables> variables;
}}

Второй ответ JSON: (DTO1)

  "data2": [{
      "id": "XYZ",
      "parameters": [{
       "timeStamp":"12345678",
        "value": "value",
        "category":"category" }]
    }]

  Class B{
List <Data2> data2;

public Data2 data2 {
.....
List<Parameters> parameters;
}
}

Окончательный ответ должен быть таким:

[{
  "id":"XYZ",
   "name":"name",
   "description":"description",
   "parameter":{
    "value": "value",
    "category":"category",
    "timeStamp":"timeStamp" 
    }

}]

Я создал DTO для каждого ответа.Я должен проверить идентификатор и объединить ответ для окончательного.

Я использовал вложенные для каждого и объединил его.

 // received response is mapped to classA

classAResponse.getData1.forEach{ a ->

a.getVariables.forEach{ v ->

classBResponse.getData2.forEach { b ->

b.getParameters.forEach{ p ->

if(a.getId.equals(b.getId)) then
 new Response(....)

});
});.....

Есть ли лучший способ?

1 Ответ

1 голос
/ 26 сентября 2019

Предполагая, что:

  1. В обоих примерах dtos представлены массивы с более чем одним объектом.
  2. Вы должны извлечь список Response только из отображаемых параметров и переменных.в обоих массивах, и исключить их в противном случае.

Тогда я думаю, что я бы использовал HashMap из-за его операций со сложностью O (1), что означает, что время, необходимое для полученияи положительные значения не зависят от размера коллекции, ее задержка может быть оценена как постоянная величина (пожалуйста, посмотрите на концепцию хеширования и как она используется в этой реализации Map).

Поэтому я думаю, что лучшим решением было бы что-то вроде этого:

Set<Response> responses = new HashSet<>(); //Or whatever collection you want.
HashMap<String, Variables> mapWithAValues = new HashMap<>(); //Key of type string, Value of type Variables.

// Put in the map every nested variable in the list of Data1
classAResponse.getData1()
.stream()
.flatMap(d -> d.getVariables().stream())
.forEach(v -> mapWithAValues.put(v.getId(), v));

classBResponse.getData2()
.stream()
.forEach(data2 -> {
  String id = data2.getId();
  // Search for a variable corresponding to this parameter.
  Variables aValue = mapWithAValues.get(id);
  if(aValue != null) {
    List<Parameter> parameters = data2.getParameters();
    // Merge data in a Response
    Response newResponse = new Response(...);
    ...
    //Add response to the list of responses.
    responses.add(newResponse);
  }
});
return responses;

Это решение будет иметь сложность O (N), где N - сумма чисел переменных и количества доступных параметров.,В вашем примере, я думаю, сложность будет O (d2 ^ V), потому что вам нужно перебрать V (количество доступных переменных), умноженное на список элементов d2 (количество доступных значений 2).

Надеюсь, это поможет :)

...