对象未被替换

时间:2011-10-26 15:19:51

标签: java

我有两个联系人列表,我希望将其中一个替换为:

private PhoneCAdapter getContactAdapter(ArrayList<UserAgenda> phoneContacts) throws NetworkConnetionException {     
    List<UserAgenda> serverContacts = WithingsAPI.getInstance().getContactListByType(Common.CONTACT_LIST_TYPE_FILE,"ALL");

    for(UserAgenda pc: phoneContacts){                  
        for(UserAgenda sc : serverContacts){
            if(pc.getEmails() != null){
                ArrayList<String> emailsPc = new ArrayList<String>(pc.getEmails());
                for(String epc: emailsPc){                      
                    ArrayList<String> emailList = new ArrayList<String>(sc.getEmails());                    
                    String emailServer = emailList.get(0);//server contact has only one email                   
                    if(epc.equals(emailServer)){//we have to substitute the object from the server with the phone ones.
                        pc = sc;
                    }
                }
            }
        }
    }   

    PhoneCAdapter ca = new PhoneCAdapter(this, 0, phoneContacts,PhoneContacts.this );
    return ca;
}

但是在循环之后我的变量phoneContacts仍然具有相同的值。仅当我手动更改字段时:

if(epc.equals(emailServer)){
    pc.setUserOfWW(sc.getUserOfWW());                           
    if(sc.getInvited().equals("true")){                             
       pc.setInvited("true");                           
    }
    else{
        pc.setInvited("false");//here we have people who are/arent user of WW
        pc.setId2invite(sc.getId2invite());
    }
}

如何用我从服务器获得的用户手机中的信息替换我的对象,而不是手动为每个字段做?

1 个答案:

答案 0 :(得分:1)

更改用于迭代器的局部变量不会更改集合的内容。了解修改变量值引用的对象与修改变量之间的区别非常重要。如果修改列表中引用所引用的对象,则该更改将通过列表显示。如果修改一个基本上包含该引用的副本的变量,则根本不会影响该列表。

我怀疑你想要:

for (int i = 0; i < phoneContacts.size(); i++) {                  
    UserAgenda pc = phoneContacts.get(i);
    for (UserAgenda sc : serverContacts) {
        if (pc.getEmails() != null) {
            ArrayList<String> emailsPc = new ArrayList<String>(pc.getEmails());
            for (String epc: emailsPc) {
                ArrayList<String> emailList = new ArrayList<String>(sc.getEmails());                    
                String emailServer = emailList.get(0);
                if (epc.equals(emailServer)) {
                    pc = sc;
                    // Replace the value in the collection too...
                    phoneContacts.set(i, sc);
                    // Do you want to break here?
                }
            }
        }
    }
}

目前还不清楚为什么你要在循环中创建数组列表,顺便说一下......(或者为什么你在每次迭代时重新创建相同的电子邮件列表)。基本上代码非常目前还不清楚,我强烈怀疑它可以大大简化 - 但是如果不知道你想要实现什么,就很难这样做。