CopyOnWriteArrayList

今天写代码的一个需求,有一个List<User>存的所有用户,现在要在增强for中把不满足条件的User    remove掉

因为前面好多判断已经写在增强for()中了,后面发现使用CopyOnWriteArrayList可以在增强for中正常remove。

结果集是List<User>类型的,无法强转为CopyOnWriteArrayList。最终把List<User>遍历了一下,然后放入CopyOnWriteArrayList,

再把List<User> clear(),再List<User>  addAll(CopyOnWriteArrayList )  哈哈,这效率得多低了。。。最终终于实现了。花了一整天。。。

上代码:

ParaGridResult<PrUser> result = this.userDao.queryPageList(userInfo,user);
		if (result != null && result.getItems() != null
				&& result.getItems().size() > 0) {
			//线程安全的list
			CopyOnWriteArrayList<PrUser> safelist=new CopyOnWriteArrayList<PrUser>();
			for(PrUser user1:result.getItems()){
				safelist.add(user1);
			}
			result.getItems().clear();
			//List<PrUser> safelist=Collections.synchronizedList(result.getItems());
			//CopyOnWriteArrayList<PrUser> safelist=(CopyOnWriteArrayList) result.getItems();
			for (PrUser cuser : safelist) {
				//获取应用账号
				if(StringUtils.isNotEmpty(cuser.getId())){
					ResAccountInfo resAccountInfo=new ResAccountInfo();
					PrUser pruser=new PrUser();
					pruser.setId(cuser.getId());
					resAccountInfo.setUser(pruser);
					//如果需要模糊查询应用账号
					if(StringUtils.isNotEmpty(resAccount)){
						String[] arr=resAccount.split(",");
						resAccountInfo.setSearchKeys(arr);
						//根据用户的id和模糊查询条件查出账号集合
						ParaGridResult<PrResAccount> accResult=resAccountService.selectAccountByUserId(resAccountInfo);
                        //PrResAccount类型的结果集 					
						List<PrResAccount> list=accResult.getItems();
                        //存放账号id的结果集
						List<String> list1=new ArrayList();
						//如果该用户有此账号
						if(list!=null){
							for(int i=0;i<list.size();i++){
								list1.add(list.get(i).getAccountNo());													
							}
							cuser.setResAccountNo(list1);
						}else{
							//如果没有该账号,需要将该记录一同移除
							safelist.remove(cuser);
						}
					}else{
						ParaGridResult<PrResAccount> accResult=resAccountService.selectAccountByUserId(resAccountInfo);
						List<PrResAccount> list=accResult.getItems();//PrResAccount类型的结果集 
						List<String> list1=new ArrayList();//存放账号id的结果集
						if(list!=null){
							for(int i=0;i<list.size();i++){
								list1.add(list.get(i).getAccountNo());
							}
							cuser.setResAccountNo(list1);
						}
						
					}					
				}				
			}
			result.getItems().addAll(safelist);
		}
		return result;

写这个一方面是记录自己碰到的问题和解决的过程,另一方面就是要在增强for进行list的remove()操作,小伙伴记得用CopyOnWriteArrayList哦,他jdk1.5就有了。

后来又优化一下:

CopyOnWriteArrayList<String> removeIds=new CopyOnWriteArrayList();
//把要移除用户的id放入该list
//然后去增强for循环外remove
for(String id:removeIds){
    Iterator<PrUser> it=result.iterator();
    while(it.hasNext()){
        if(id.equals(it.next.getId())){
            it.remove();
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值