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

实现方法:

public class Test2 {

    public static void main(String[] args) {
        Map<Long, List<Long>> map = new LinkedHashMap<>(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(9L);
        list4.add(6L);
        List<Long> list5 = new ArrayList<>();
        list5.add(6L);
        list5.add(7L);
        List<Long> list6 = new ArrayList<>();
        list6.add(10L);
        list6.add(11L);
        List<Long> list7 = new ArrayList<>();
        list7.add(4L);
        list7.add(55L);
        List<Long> list8 = new ArrayList<>();
        list8.add(5L);
        list8.add(55L);
        List<Long> list9 = new ArrayList<>();
        list9.add(99L);
        list9.add(88L);
        list9.add(11L);

        map.put(1L, list1);
        map.put(2L, list2);
        map.put(3L, list3);
        map.put(4L, list4);
        map.put(5L, list5);
        map.put(6L, list6);
        map.put(7L, list7);
        map.put(8L, list8);
        map.put(9L, list9);

        List<Long> mergedValue = new ArrayList<>();
        List<Long> keyLists = new ArrayList<>(map.keySet());
        Map<List<Long>, List<Long>> newMap = new HashMap<>(16);

        while (keyLists.size() > 0) {
            List<Long> valueList = map.get(keyLists.get(0));
            List<Long> keyList = new ArrayList<>();
            keyList.add(keyLists.get(0));
            map.remove(keyLists.get(0));
            keyLists.remove(keyLists.get(0));
            boolean merged = true;
            while (merged) {
                merged = false;
                List<List<Long>> mergingList = new ArrayList<>();
                for (Long value : valueList) {
                    if (mergedValue.contains(value)) {
                        continue;
                    }
                    mergedValue.add(value);
                    Iterator<Map.Entry<Long, List<Long>>> iterator = map.entrySet().iterator();
                    while (iterator.hasNext()) {
                        Map.Entry<Long, List<Long>> entry = iterator.next();
                        Long entryKey = entry.getKey();
                        List<Long> entryValue = entry.getValue();
                        if (entryValue.contains(value)) {
                            mergingList.add(entryValue);
                            keyList.add(entryKey);
                            iterator.remove();
                            keyLists.remove(entryKey);
                            merged = true;
                        }
                    }
                }
                mergingList.forEach(valueList::addAll);
            }
            newMap.put(keyList, valueList.stream().distinct().collect(Collectors.toList()));
        }
        System.out.println(newMap);
    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值