实现二: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]}