Есть ли способ объединить два списка, в которых будет второй элемент списка в каждом подсписке в первом?

avatar
Vikram Aditya
9 августа 2021 в 05:21
89
2
1

Вот мой код, который вернет комбинированный список:

List<Map<String, Object>> viewList = new ArrayList<Map<String,Object>>();
List<Map<String, Object>> viewList1 = new ArrayList<Map<String,Object>>();

Map<String, Object> viewMap1 = new HashMap<String, Object>();
viewMap1.put("ARTICLE_ID", "000000001000100126");
viewMap1.put("SOURCE_ID", "0000007001");
viewMap1.put("UOM", "CS");

Map<String, Object> viewMap2 = new HashMap<String, Object>();
viewMap2.put("ARTICLE_ID", "000000001000100126");
viewMap2.put("SOURCE_ID", "0000007001");
viewMap2.put("UOM", "EA");

Map<String, Object> viewMap3 = new HashMap<String, Object>();
viewMap3.put("ARTICLE_ID", "000000001000100126");
viewMap3.put("SOURCE_ID", "0000007001");
viewMap3.put("UOM", "YD2");

Map<String, Object> viewMap4 = new HashMap<String, Object>();
viewMap4.put("BASEQUANTITY", "3");

viewList.add(viewMap1);
viewList.add(viewMap2);
viewList.add(viewMap3);

viewList1.add(viewMap4);

List<Map<String, Object>> combinedList = Stream.of(viewList, viewList1)
                                               .flatMap(x -> x.stream())
                                               .collect(Collectors.toList());
System.out.println(combinedList);

Я получаю вывод следующим образом:

[{uom = cs, source_id = 0000007001, article_id = 000000001000100126}, {uom = ea, source_id = 0000007001, article_id = 0000001000100126}, {uom = yd2, source_id = 0000001000126}, {uom = yd2, source_id = 0000001000126}, {uom = yd2, source_id = 0000001000126}, {uom = yd2, source_id = 0000001000126 }]

Я хочу, чтобы результат выглядел следующим образом:

[{uom = cs, source_id = 0000007001, article_id = 000000001000100126, basequantity = 3}, {uom = ea, source_id = 0000007001, article_id = 000000100010026, basequante = 3}, straice_id = 000000100010026, strice_id = xid_id = xid_id = xid = 0000001000126. =000000001000100126, БАЗОВАЯ РАСЧЕТНОСТЬ=3}]

Как добавить последний элемент, т. е. BASEQUANTITY=3 из combinedList, в каждый подсписок первого списка и удалить этот элемент из combinedList, как показано в выводе выше. Пожалуйста, помогите.

Источник
ernest_k
9 августа 2021 в 05:28
0

Почему вторая карта вообще в списке? Похоже, все, что вам нужно, это скопировать одну запись во все списки из viewList?

Vikram Aditya
9 августа 2021 в 05:43
0

@ernest_k, есть требование, так как нам нужно объединить 2 списка карт.

Preston
9 августа 2021 в 06:50
0

Вы хотите, чтобы это? List<Map<String, Object>> объединенный List = view List.stream().map(x -> x.putAll(viewMap4)).collect(Collectors.toList());

Vikram Aditya
9 августа 2021 в 06:59
0

@ Престон Престон, я не уверен, что это выдает мне ошибку. Не могли бы вы подтвердить свой ответ.

Preston
9 августа 2021 в 07:58
1

Обновления: List<Map<String, Object>> CombinedList = viewList.stream().map(x -> { x.putAll(viewMap4); return x; }).collect(Collectors.toList());

Ответы (2)

avatar
Nowhere Man
24 августа 2021 в 12:02
0

Решение, предложенное @Gautham M, затрагивает viewList, поскольку combinedList создается как поверхностная копия viewList, и оба списка ссылаются на одни и те же карты. Таким образом, при добавлении содержимого viewList1 к каждой карте в combinedList оно также "появляется" в viewList.

.

Кроме того, в общем случае, если необходимо добавить содержимое всех записей всех карт в viewList1, этот список должен быть сведен в одну карту, а затем эта карта промежуточного итога добавляется в копии карт в viewList:

Map<String, Object> subtotal = viewList1
    .stream()
    .flatMap(map -> map.entrySet().stream())
    .collect(Collectors.toMap(
        Map.Entry::getKey, 
        Map.Entry::getValue, 
        (v1, v2) -> v1 // resolve possible conflicts by keeping the first value
    ));

List<Map<String, Object>> combinedList = viewList
    .stream() // Stream<Map>
    .map(HashMap::new) // copy map is created
    .peek(copy -> copy.putAll(subtotal))
    .collect(Collectors.toList());

System.out.println("combined:\n" + combinedList);

System.out.println("\ninitial:\n" + viewList);

Вывод

комбинированный:
[{Basequantity = 3, uom = cs, source_id = 0000007001, article_id = 000000001000100126}, {basequantity = 3, uom = ea, source_id = 0000007001, article_id = 0000001000100126}, {basequantity = 3, uoom = 000000001000126}, {basequantity = 3, uom = yd2, yd2, yd2, yd2, yd2, yd2, yd2, uom = yd2, yd2, йд2, йд2, 0000001000126}. ARTICLE_ID=000000001000100126}]

инициал:
[{Uom = cs, source_id = 0000007001, article_id = 000000001000100126}, {uom = ea, source_id = 0000007001, article_id = 000000001000100126}, {uom = yd2, source_id = 0000007001, article_id = {uom = yd2, source_id = 0000007001, article_id = 000011100100100100100100100100100100100100100100126.

avatar
Gautham M
9 августа 2021 в 06:54
1

Не транслируйте их оба вместе, так как похоже, что вам нужно, чтобы каждая пара ключ-значение каждой карты во втором списке добавлялась к каждой карте в первом списке.

// first add everything from viewList to combinedList
List<Map<String, Object>> combinedList = new ArrayList<>(viewList);

// Now for every map in combinedList (which is now equivalent to viewList),
// add contents of every map from viewList1 to combinedList.
combinedList.forEach(map -> viewList1.forEach(map2 -> map.putAll(map2)));

or,
```java
combinedList.forEach(map -> viewList1.forEach(map::putAll));

РЕДАКТИРОВАТЬ: Несмотря на то, что добавление/удаление элементов в combinedList не будет отражаться в viewList, как указал Алекс, любые изменения элементов карты в пределах combinedList будут отражены в картах viewList (как new ArrayList<>(viewList) используется для создания combinedList).

Чтобы этого избежать, combinedList можно инициализировать как:

List<Map<String, Object>> combinedList = viewList.stream().map(HashMap::new).collect(Collectors.toList());
Vikram Aditya
9 августа 2021 в 07:03
0

Не могли бы вы дать краткий ответ? Мне нужен результат комбинированного списка, как в List<Map<String, Object>>

Gautham M
9 августа 2021 в 07:08
0

@VikramAditya Я обновил ответ. Надеюсь теперь понятно