有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:访问同一ArrayList,同时使用该ArrayList中的其余元素

我有一个具有以下结构的数据库表:出于本文的目的,我想将该表称为MixUserTable

id, user_id, partner_id
1, 333cx1, s12z
2, 333xx1, r23z
3, r23z, t32q

我有一个不同的过程来获取包含ID列表的数组列表,它有一个user_idpartner_id的混合器

我试图遍历包含混合ID的ArrayList,并希望确认ArrayList中的每个元素在数据库中是否都有对。但要做到这一点,我必须访问多个元素才能进行数据库调用

以下是我尝试的方法:

我首先复制一个我已传递的ArrayList:然后我迭代原始ArrayList及其副本以检查该对是否存在:

ArrayList<UserDAO> tempPeople = new ArrayList<UserDAO>();
tempPeople = originalArrayList

for(UserDAO user : originalArrayList) {
  for (UserDAO copyUser : tempPeople) {
    if(!user.getId().equals(copyUser.getId())) {
      //select * from mixuser where user_id = 'someUvalue' and partner_id = 'otherUserValue'
      MixUserDAO mixUser = (MixUserDAO)myBatisUtil.select(myBatisUtil.MIXUSERDAO, "select", queryParams);
      if(mixUser != null) {
        Do something like update etc
      }
    }
  }
}

我的问题是,这是处理这种情况的一种好方法,可以避免像java.util.ConcurrentModificationException这样的异常

如果不是,处理这种情况的更好方法是什么


共 (1) 个答案

  1. # 1 楼答案

    ConcurrentModificationException的问题在于:

    tempPeople = originalArrayList
    

    执行此代码时,声明一个指向originalArrayList的指针。正确的代码应该是:

    tempPeople = new ArrayList(originalArrayList)
    

    更新 更准确的例子:

    String userIDs = "";
    for(UserDAO user : originalArrayList) {
      userIDs += user.getId() + ",";
    }
    userIDs = userIDs.substring(0, userIDs.length-1); //remove last ','
    
    //select * from mixuser where user_id in (list) and partner_id in (list)
    MixUserDAO mixUser = (MixUserDAO)myBatisUtil.select(myBatisUtil.MIXUSERDAO, "select", userIDs);
    

    在myBatis xml mapper中:

    <select id="selectUsers" resultType="domain.blog.MixUserDAO" parameterType="java.lang.String">
      select * from mixuser
      WHERE user_id in ('#{value}') and partner_id in ('#{value}')
    </select>
    

    您将在originalArrayList中获得所有同时具有userID和parentID的用户