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; // 没有同类项为falseString 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);}
}

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

  1. 并查集板子:acwing836. 合并集合

    文章目录 并查集原理 并查集代码实现 并查集原理 并查集的常用操作: 将两个集合合并 询问两个元素是否在同一个集合中 并查集在近乎O(1)的时间内完成以上两个操作. 基本原理:每个集合用一棵树表示.树 ...

  2. ~~并查集模板(数据结构)(附题目AcWing 836. 合并集合)

    (1)朴素并查集: int p[N]; //存储每个点的祖宗节点// 返回x的祖宗节点int find(int x){if (p[x] != x) p[x] = find(p[x]);return p ...

  3. 算法(并查集--合并集合)

    并查集–合并集合 一共有n个数,编号是1~n,最开始每个数各自在一个集合中. 现在要进行m个操作,操作共有两种: "M a b",将编号为a和b的两个数所在的集合合并,如果两个数已 ...

  4. AcWing 836. 合并集合

    题目连接 https://www.acwing.com/problem/content/838/ 思路 并查集模板题 当操作是合并时,先判断两者是否在一个集合,然后合并(其实不用判断也可以,反正都是一 ...

  5. BBB学习(十五):Ubuntu环境配置(4)-eclipse连接BBB

    一.前言 在前节中已经具体讲了eclipse的安装及GDB及gdbserver的编译,本节之后将具体讲怎么用eclipse与BBB在线仿真调试程序.首先就是采用一种简单的方式将前节中编译好的gdbse ...

  6. BBB(二):Windows或Ubuntu主机通过USB分享网络给BBB

    写在前面 Windows下通过ssh.串口等的连接,做一些基本操作还是可以的.后面安装.编译Image.文件共享等可能就要在Linux下了.因此就有了这样一篇总结性的文章. "Beagleb ...

  7. java list集合合并_JAVA List合并集合

    import java.util.ArrayList; import java.util.List; public class test { public static void main(Strin ...

  8. ddd java repository_初探领域驱动设计(2)Repository在DDD中的应用

    概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...

  9. DDD洋葱架构才是 yyds,阿里架构师手记(DDD)领域驱动设计应对之道

    虽然身为架构师,设计一个高质量的架构依然是复杂与困难的. 简单来说,动用大量的资源只为了一套优质的三高架构并不正确,而是该在了解当前业务现状的情况下,创造出灵活.可维护.健硕能成长的. 就拿近两年程序 ...

  10. awk匹配以aaa开头,以bbb结尾的内容,同时aaa和bbb之间还包含ccc

    如果是匹配以A开头,以B结尾的内容,同时A和B之间还包含C的这种怎么做? 比如 [root@localhost ~]#cat file aaa grge ddd bbbaaa gege ccc bbb ...

最新文章

  1. C++(一)——存储持续性、作用域、链接性
  2. linux的used 内存去向,Linux Used内存储器到底哪里去了
  3. Please copy/symlink the 'missing image' image at xxx
  4. NodeJS学习笔记(一)——搭建开发框架Express,实现Web网站登录验证
  5. resultset不支持循环遍历_二叉树的各种遍历方法的简单解释
  6. KDD2020 | 半监督迁移协同过滤推荐
  7. Flutter基础(四)开发Flutter应用前需要掌握的Basic Widget
  8. PHP 怎么随机获取数组里面的值
  9. Linux第一讲(韩顺平)
  10. 拦截导弹 (最长上升子序列LIS)
  11. 微信小程序获取scope中权限管理
  12. 浅谈算法和数据结构: 八 平衡查找树之2-3树
  13. Android修改读写速度,Android 通过adb测试机器读写速度(rk)
  14. 微信多开下载安装使用及更新方式
  15. 利用Java实现将华氏温度转换为摄氏温度
  16. 如何用Amira分割DICOM图像
  17. 格力成立子公司造芯片 亲自挂帅的董明珠能成功吗
  18. VPS云主机怎么用?
  19. 关于前端会用到的一些技术栈
  20. 分析的环绕声,它的功能如何

热门文章

  1. 这些和编程有关的日本动漫,你都看过那几部?
  2. css怎么修改图片像素,怎么改变图片宽度_word怎么改变图片像素大小
  3. 蒂姆•库克在斯坦福毕业典礼上都讲了啥?
  4. mysql不支持rank()_Mysql 实现 rank 和 != 问题
  5. 图像分割-连通区域分析
  6. 严蔚敏《数据结构》——二叉树
  7. pyd文件逆向(二)
  8. Linux增加一块scsi硬盘,Linux下添加第二块scsi硬盘
  9. Android 应用换肤功能(白天黑夜主题切换)
  10. 我找遍全网,整理了1份纯新手向电脑购机&装机攻略!