实现二:Map<Long, List<Long>> 存放的value 可能含有重复元素,将value 中含有重复元素的Map 重新组合

举例:

Map<Long, List<Long>> map = new HashMap<>(16);
List<Long> list1 = new ArrayList<>();
list1.add(1L);
list1.add(2L);
List<Long> list2 = new ArrayList<>();
list2.add(2L);
list2.add(3L);
List<Long> list3 = new ArrayList<>();
list3.add(3L);
list3.add(4L);
List<Long> list4 = new ArrayList<>();
list4.add(5L);
list4.add(6L);
List<Long> list5 = new ArrayList<>();
list5.add(6L);
list5.add(7L);
map.put(1L,list1);
map.put(2L,list2);
map.put(3L,list3);
map.put(4L,list4);
map.put(5L,list5);
Map<List<Long>,List<Long>> map2 = new HashMap<>(16);

list1,list2,list3 含有重复元素 ,map2中key ->list 放map中list1,list2,list3对应的key的集合[1,2,3],value->list 放 list1,list2,list3去重后的list[1,2,3,4]。

期望结果: map2: key:[1,2,3] value:[1,2,3,4]; key:[4,5] value:[5,6,7]

实现方法:

 1 public class Test2 {
 2 
 3     public static void main(String[] args) {
 4         Map<Long, List<Long>> map = new LinkedHashMap<>(16);
 5         List<Long> list1 = new ArrayList<>();
 6         list1.add(1L);
 7         list1.add(2L);
 8         List<Long> list2 = new ArrayList<>();
 9         list2.add(2L);
10         list2.add(3L);
11         List<Long> list3 = new ArrayList<>();
12         list3.add(3L);
13         list3.add(4L);
14         List<Long> list4 = new ArrayList<>();
15         list4.add(9L);
16         list4.add(6L);
17         List<Long> list5 = new ArrayList<>();
18         list5.add(6L);
19         list5.add(7L);
20         List<Long> list6 = new ArrayList<>();
21         list6.add(10L);
22         list6.add(11L);
23         List<Long> list7 = new ArrayList<>();
24         list7.add(4L);
25         list7.add(55L);
26         List<Long> list8 = new ArrayList<>();
27         list8.add(5L);
28         list8.add(55L);
29         List<Long> list9 = new ArrayList<>();
30         list9.add(99L);
31         list9.add(88L);
32         list9.add(11L);
33 
34         map.put(1L, list1);
35         map.put(2L, list2);
36         map.put(3L, list3);
37         map.put(4L, list4);
38         map.put(5L, list5);
39         map.put(6L, list6);
40         map.put(7L, list7);
41         map.put(8L, list8);
42         map.put(9L, list9);
43 
44         List<Long> mergedValue = new ArrayList<>();
45         List<Long> keyLists = new ArrayList<>(map.keySet());
46         Map<List<Long>, List<Long>> newMap = new HashMap<>(16);
47 
48         while (keyLists.size() > 0) {
49             List<Long> valueList = map.get(keyLists.get(0));
50             List<Long> keyList = new ArrayList<>();
51             keyList.add(keyLists.get(0));
52             map.remove(keyLists.get(0));
53             keyLists.remove(keyLists.get(0));
54             boolean merged = true;
55             while (merged) {
56                 merged = false;
57                 List<List<Long>> mergingList = new ArrayList<>();
58                 for (Long value : valueList) {
59                     if (mergedValue.contains(value)) {
60                         continue;
61                     }
62                     mergedValue.add(value);
63                     Iterator<Map.Entry<Long, List<Long>>> iterator = map.entrySet().iterator();
64                     while (iterator.hasNext()) {
65                         Map.Entry<Long, List<Long>> entry = iterator.next();
66                         Long entryKey = entry.getKey();
67                         List<Long> entryValue = entry.getValue();
68                         if (entryValue.contains(value)) {
69                             mergingList.add(entryValue);
70                             keyList.add(entryKey);
71                             iterator.remove();
72                             keyLists.remove(entryKey);
73                             merged = true;
74                         }
75                     }
76                 }
77                 mergingList.forEach(valueList::addAll);
78             }
79             newMap.put(keyList, valueList.stream().distinct().collect(Collectors.toList()));
80         }
81         System.out.println(newMap);
82     }
83 }

实现结果:{[1, 2, 3, 7, 8]=[1, 2, 3, 4, 55, 5], [4, 5]=[9, 6, 7], [6, 9]=[10, 11, 99, 88]}

posted @ 2021-01-08 17:15  山阴路的秋天  阅读(334)  评论(0编辑  收藏  举报