Как объединить два ArrayList> одному? - PullRequest
0 голосов
/ 05 февраля 2019

ArrayList<Map<String, String>> result1

result1 похоже на

(1, a)
(2, a)
(3, b)
(4, e)
(5, e)

ArrayList<Map<String, String>> result2

result2 похоже на

(1,android)
(2,ios)
(3,android)
(4,android)
(5,ios)

Iхотите объединить две карты, чтобы построить такую ​​карту, как эта

(1, ( a, android))
(2, ( a, ios))
(3, ( b, android))
(4, (e, android))
(5, (e, ios))

Как это сделать?

Ответы [ 4 ]

0 голосов
/ 05 февраля 2019

Это один из способов получения результата:

Входные данные :

// The first list of data
List<Map<String, String>> list1 = new ArrayList<>();
list1.add(getMapData("1", "a"));
list1.add(getMapData("2", "a"));
list1.add(getMapData("3", "b"));
list1.add(getMapData("4", "e"));
list1.add(getMapData("5", "e"));
list1.add(getMapData("999", "x"));
System.out.println(list1);

Данные 1: [{1=a}, {2=a}, {3=b}, {4=e}, {5=e}, {999=x}]

// The second list of data
List<Map<String, String>> list2 = new ArrayList<>();
list2.add(getMapData("1", "android"));
list2.add(getMapData("2", "ios"));
list2.add(getMapData("3", "android"));
list2.add(getMapData("4", "android"));
list2.add(getMapData("5", "ios"));
list2.add(getMapData("888", "zzzzz"));
System.out.println(list2);

Данные 2: [{1=android}, {2=ios}, {3=android}, {4=android}, {5=ios}, {888=zzzzz}]

// utility method for creating test data
private static Map<String, String> getMapData(String k, String v) {
    Map<String, String> m = new HashMap<>();
    m.put(k, v);
    return m;
}


Процесс результата :

Вывод сохраняется в Map<String, List<String>>:

Map<String, List<String>> result = new HashMap<>();

// process the first list
for (Map<String, String> m : list1) {
    for (Map.Entry<String, String> entry : m.entrySet()) {
        List<String> valueList = new ArrayList<>();
        valueList.add(entry.getValue());
        result.put(entry.getKey(), valueList);
    }
}

// process the second list; merge with the first
for (Map<String, String> m : list2) {
    for (Map.Entry<String, String> entry : m.entrySet()) {
        String k = entry.getKey();
        List<String> valueList = result.get(k);
        if (valueList == null) {
            valueList = new ArrayList<>();
        }
        valueList.add(entry.getValue());
        result.put(k, valueList);
    }
}

System.out.println(result);

Результат :

{1=[a, android], 2=[a, ios], 3=[b, android], 4=[e, android], 5=[e, ios], 888=[zzzzz], 999=[x]}
0 голосов
/ 05 февраля 2019

Вы можете объединить два потока с Stream.concat() и сгруппировать их с Collectors.groupingBy() и Collectors.mapping():

Map<String, String> first = Map.of("1", "a", "2", "a");
Map<String, String> second = Map.of("1", "android", "2", "ios");
Map<String, List<String>> result = Stream.concat(first.entrySet().stream(), second.entrySet().stream())
            .collect(groupingBy(Entry::getKey, mapping(Entry::getValue, toList())));
System.out.println(result);

будет выводить:

{1=[a, android], 2=[a, ios]}
0 голосов
/ 05 февраля 2019

Вы также можете попробовать этот подход:

Map<String, String> result1 = new HashMap<>();
// initialize result1 ...

Map<String, String> result2 = new HashMap<>();
// initialize result2 ...

Map<String, Map<String, String>> mergedResult = new HashMap<>();

До Java 8

result1.forEach((k1, v1) ->
            mergedResult.put(k1, new HashMap<String, String>() {{
                put(v1, result2.get(k1));
            }}));

Java 9 или новее

result1.forEach((k1, v1) -> mergedResult.put(k1, 
                                 Map.of(v1, result2.get(k1))));
0 голосов
/ 05 февраля 2019

Для указанного здесь требования вы можете сделать это следующим образом.

Я перебираю ключи первой карты.И собирая значения для каждого ключа со всех карт и помещая их в список.Затем поместите список в результирующую карту.

import java.util.*;

public class MergeMaps
{
  public static void main(String[] args)
  {
    Map<String, String> map1 = new HashMap<>();
    map1.put("1", "a");
    map1.put("2", "a");
    map1.put("3", "b");
    map1.put("4", "e");
    map1.put("5", "e");

    Map<String, String> map2 = new HashMap<>();
    map2.put("1", "android");
    map2.put("2", "ios");
    map2.put("3", "android");
    map2.put("4", "android");
    map2.put("5", "ios");

    Set<String> keys = new HashSet<>();
    keys.addAll(map1.keySet());
    keys.addAll(map2.keySet());

    Map<String, List<String>> mergedMap = new HashMap<>();
    for (String key : keys)
    {
      List<String> list = new ArrayList<>();
      list.add(map1.get(key));
      list.add(map2.get(key));
      mergedMap.put(key, list);
    }

    System.out.println(mergedMap);
  }
}

Вывод будет:

{1=[a, android], 2=[a, ios], 3=[b, android], 4=[e, android], 5=[e, ios]}

...