遍历List列表进行选择性的删除操作
2008-10-31 10:44
393 查看
遍历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删除后,后面的对象自动向前移动的特性来操作未遍历的对象了。
*如有其它情况,请大家补充。谢谢。
如下代码是我实际项目的用过的:
说明:当指定一个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删除后,后面的对象自动向前移动的特性来操作未遍历的对象了。
*如有其它情况,请大家补充。谢谢。
相关文章推荐
- List 遍历 中进行 删除操作 的做法
- list,set等集合遍历时,不能remove集合中的元素。需要new一个Object或者list,set,里面add需要删除的元素,等集合遍历完了进行remove(Object)或者removeAll(list/set)操作
- Java中list如何利用遍历进行删除操作
- Java-集合 list对象进行指定位置插入、删除、迭代、遍历输出(具体习题讲解)
- C# 对sharepoint 列表的一些基本操作,包括添加/删除/查询/上传文件给sharepoint list添加数据
- 在SQL Server 集成服务中使用开源SharePoint List组件对SharePoint列表进行ETL操作!
- 在遍历List时,对List里的对象进行remove(),此操作会改变List的大小()
- [Phonegap+Sencha Touch] 移动开发72 List列表横向滑动操作(仿QQ列表滑动删除)
- C# 对sharepoint 列表的一些基本操作,包括添加/删除/查询/上传文件给sharepoint list添加数据
- C# 对sharepoint 列表的一些基本操作,包括添加/删除/查询/上传文件给sharepoint list添加数据
- DataGridView绑定List时无法进行添加删除操作的解决方法
- PyCharm中按住Alt键,可以选择一个指定列表,然后对这个数列进行操作,比如删除,增加等等
- 这是一个定时脚本,主要功能是遍历该文件夹下的所有文件并存储到数组,对数据中的文件进行操作,一个一个移动到指定的目录下,并删除原有文件
- [Phonegap+Sencha Touch] 移动开发72 List列表横向滑动操作(仿QQ列表滑动删除)
- 【笔记】对遍历List,对List里的对象做删除操作
- C# 对sharepoint 列表的一些基本操作,包括添加/删除/查询/上传文件给sharepoint list添加数据
- C# 对sharepoint 列表的一些基本操作,包括添加/删除/查询/上传文件给sharepoint list添加数据
- python入门之列表list删除操作
- C# 对sharepoint 列表的一些基本操作,包括添加/删除/查询/上传文件给sharepoint list添加数据
- C# 对sharepoint 列表的一些基本操作,包括添加/删除/查询/上传文件给sharepoint list添加数据