遍历List列表进行选择性的删除操作可以用于一个显示的List中,需要删除一部份对象的同时,也可以向List中添加一部分对象的情况。
如下代码是我实际项目的用过的:
说明:当指定一个userId的时候,可以在界面上显示已经分配给该用户的角色,此时,使用的用户可以有两个操作,一个是将已经存在的角色删除一部分,还有一个操作是从未添加的角色中,再选择一部分分配给该用户。具体请看代码。
/**
* 设置用户角色映射
* @param userId
* @param roles 进行删除添加后的角色列表
*/
public static void setUserRoleRef(int userId, List<SysRole> roles) {
// 数据库中已经存在的映射
List<SysUserRoleRef> refs = new ArrayList<SysUserRoleRef>();
SysUserRoleRefExample example = new SysUserRoleRefExample();
example.createCriteria().andUserIDEqualTo(userId);
try {
refs = DBFactory.getSysUserRoleRef().selectByExample(example);
} catch (SQLException e) {
logger.error("搜索用户角色映射错误!", e);
}
// 删除两个列表中都存在的映射
for (int i = 0; i < refs.size(); i++) {
for (int j = 0; j < roles.size(); j++) {
if (refs.get(i).getRoleID().equals(roles.get(j).getRoleID())) {
if (refs.remove(refs.get(i)))
i--;
if (roles.remove(roles.get(j)))
j--;
// 删除后,重新开始
break;
}
}
}
try {
Iterator<SysUserRoleRef> itRefs = refs.iterator();
while (itRefs.hasNext()) {
SysUserRoleRef ref = new SysUserRoleRef();
ref = itRefs.next();
DBFactory.getSysUserRoleRef().deleteByPrimaryKey(
ref.getUserRoleRefID());
}
Iterator<SysRole> itNewRoles = roles.iterator();
while (itNewRoles.hasNext()) {
SysRole role = itNewRoles.next();
SysUserRoleRef ref = new SysUserRoleRef();
ref.setUserRoleRefID(Sequence
.getNext(KeyConstants.KEY_SYS_USER_ROLE_REF));
ref.setUserID(userId);
ref.setRoleID(role.getRoleID());
DBFactory.getSysUserRoleRef().insert(ref);
}
} catch (SQLException e) {
logger.error("更改用户角色映射错误!", e);
}
}
这段代码特别需要注意的地方是那个对两个列表进行删除操作的for循环,特别是删除后所做的动作。删除后做了标记的--自减动作,是为了下一次进行循环体前做++自加做提前--的准备,从而使得下次标记的位置还是上一次的位置。
举例:
当前是标记 i = 1的时候,进行了删除,那么--后就是0了,当执行i++的时候,重新获得标记1的位置。这样就充分利用了List删除后,后面的对象自动向前移动的特性来操作未遍历的对象了。
*如有其它情况,请大家补充。谢谢。