字符集合问题


编写一个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()操作了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值