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);
}
}
合并集合 {aaa,bbb,ccc},{bbb,ddd},{eee,fff},{ggg},{ddd,hhh}运算的结果:{aaa,bbb,ccc,ddd,hhh},{eee,fff},{ggg}
最新推荐文章于 2022-03-30 15:07:09 发布