合并集合 {aaa,bbb,ccc},{bbb,ddd},{eee,fff},{ggg},{ddd,hhh}运算的结果:{aaa,bbb,ccc,ddd,hhh},{eee,fff},{ggg}

package com.zhiyou100.homework.mergecollection;

import java.util.*;

// 合并集合
/*
    {aaa,bbb,ccc},{bbb,ddd},{eee,fff},{ggg},{ddd,hhh}
    运算的结果:{aaa,bbb,ccc,ddd,hhh},{eee,fff},{ggg}
 */
public class MergeCollectiong {
    public static void main(String[] args) {
        // 合并后的集合
        Map<String, Set<String>> mergeBigSet = new TreeMap<>();
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("请输入要合并的集合如: aaa,bbb,ccc");
            String coll = scanner.next();
            String[] split = coll.split(",");
            // 获取小集合首字母
            String first = "";
            // 创建新集合
            Set<String> set = new TreeSet<>();
            for (int i = 0; i < split.length; i++) {
                set.add(split[i]);
                if (i == 0) {
                    first = split[0].substring(0, 1);
                }
            }
            // 如果第一次直接添加
            if (mergeBigSet.size() == 0) {
                mergeBigSet.put(first, set);
            } else { // 不是第一次添加
                // 所有合并后添加的的集合键的set集合
                Set<String> keySet = mergeBigSet.keySet();
                Iterator<String> iterator = keySet.iterator();
                int n = 0;  // 记录mergeBigSet迭代时,迭代次数
                boolean isNo = false; // 没有同类项为false
                String firstKey = ""; // 新集合与合并后集合中小集合,第一次合并的小集合的键值
                ArrayList<String> removeKey = new ArrayList<>(); // 记录需要合并的小集合,用于后期删除
                while (iterator.hasNext()) {
                    n++; // 迭代一次自加一
                    // 合并后集合mergeBigSet的小集合对应的某个键
                    String key = iterator.next();
                    if (first.equals(key)) { // 如何出项相同的键,就在建的后面+ “1”
                        first = first + "1";
                    }
                    // 合并后集合mergeBigSet的小集合对应的某个值
                    Set<String> valueSet = mergeBigSet.get(key);
                    // 第一种情况  遍历 valueSet 是否有和 split相同的元素
                    Iterator<String> iterator1 = valueSet.iterator();
                    boolean is = false;
                    while (iterator1.hasNext()) {
                        String value = iterator1.next();
                        for (int i = 0; i < split.length; i++) {
                            if (value.equals(split[i]) && isNo == false) {  // 如果元素相等,且第一次出现相同项
                                is = true;
                                firstKey = key;
                                break;
                            } else if (value.equals(split[i])) {  // 两次以上出现同类项
                                is = true;
                                break;
                            }
                        }
                    }
                    if (is) {
                        // 如果第一次与合并集合出现相同项
                        if (isNo == false) {
                            for (int j = 0; j < split.length; j++) {
                                valueSet.add(split[j]);
                            }
                            isNo = true; // 至少出现一次合并同类项
                            continue;
                        } else if (isNo == true) {    // 如果第多次与合并集合出现相同项
                            // 获取新集合与合并后集合第一次出现同类项的集合(值)
                            Set<String> setfirst = mergeBigSet.get(firstKey);
                            // 迭代此次合并后集合当次的值里的元素,合并到第一次在合并后集合出现的小集合中
                            Iterator<String> iterator2 = valueSet.iterator();
                            while (iterator2.hasNext()) {
                                String value2 = iterator2.next();
                                setfirst.add(value2);      // 合并到第一次在合并后集合出现的小集合中
                            }
                            // 在记录需要合并的小集合中,添加需要删除的小集合
                            removeKey.add(key);
                            continue;
                        }
                    }
                    // 第二种情况 不重复直接在合并的大集合后面添加
                    if (mergeBigSet.size() == n && isNo == false) {
                        mergeBigSet.put(first, set);
                    }
                }
                // 删除所有合并集合中出现需要合并的元素,因为已经在第一个出现需要合并的小集合中合并
                if (removeKey.size() != 0) {
                    for (int i = 0; i < removeKey.size(); i++) {
                        mergeBigSet.remove(removeKey.get(i));
                    }
                }
            }
            System.out.println("是否还添加集合 1. 添加 2. 不添加");
            int n = scanner.nextInt();
            if (n == 1) {

            } else if (n == 2) {
                break;
            }
        }
        System.out.println("合并后的集合");
        System.out.println(mergeBigSet);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值