编写一个Java应用程序,对于给定的一个字符串的集合,格式如:
{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}
要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应输出:
{aaa bbb ccc ddd hhh},{eee fff}, {ggg}
(1)分析问题,描述你解决这个问题的思路、处理流程,以及算法复杂度。
(2)编程实现题目要求的集合合并。
(3)描述可能的改进(改进的方向如效果,算法复杂度,性能等等)。
主要用的到思想:set的去重功能。
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class 交集 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
java.util.List<Set<String>> list=new ArrayList<Set<String>>();
Scanner scanner=new Scanner(System.in);
String temp[]=scanner.nextLine().replace("}","").replace("{","").split(",");//将
//其分解成aa bbb bb cc dd ee小组
for (int i = 0; i < temp.length; i++) {
Set<String> tempsetSet=new TreeSet<String>();
String tempString[]=temp[i].trim().split(" ");
for (int j = 0; j < tempString.length; j++) {
tempsetSet.add(tempString[j]); //将每一个小组添加到不可重复的set里面
}
list.add(tempsetSet);
}
for (int i = 0; i < list.size(); i++) {
Set<String> firStrings=list.remove(i);
for(Set<String> str:list){
for (String string : str) {
if(firStrings.contains(string)){
firStrings.addAll(str);
}
}
}
list.add(i, firStrings);
}
//此时的list [[aaa, bbb, ccc, ddd, hhh], [aaa, bbb, ccc, ddd, hhh], [eee, fff], [ggg], [aaa, bbb, ccc, ddd, hhh]]
//去重复的步骤
java.util.List<Set<String>> result=new ArrayList<Set<String>>();
// Set<Set<String>> result=new TreeSet<Set<String>>();
int n=list.size();
// 因为下面要remove所以i<list.size().一定是错误的,切记。
for (int i = 0; i < n; i++) {
Set<String> strings=list.remove(0);
if(!result.contains(strings))
result.add(strings);
}
for(Set<String> str:result){
System.out.println(str);
}
}
}
我原想用这个方法去重复但是发现不对:
失误的错误。。。。
for(Set<String> str:list){
list.remove(str);
if(!result.contains(str))
result.add(str);
}
在执行了remove方法之后,再去执行循环,iter.next()的时候,报java.util.ConcurrentModificationException(当然,如果remove的是最后一条,就不会再去执行next()操作了)