遍歷List列表進行選擇性的刪除操作

遍歷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刪除後,後面的對象自動向前移動的特性來操作未遍歷的對象了。

 

*如有其它情況,請大家補充。謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章