遍歷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刪除後,後面的對象自動向前移動的特性來操作未遍歷的對象了。
*如有其它情況,請大家補充。謝謝。