2013-11-22 311 views
0

我需要一个解决方案来更改Java中多维ArrayList中元素的值。这是我的ArrayList: 公共类用户{更改多维ArrayList的值

ArrayList<ValidateUser> personer = new ArrayList<ValidateUser>(); 

public Users() { 
    personer.add(new ValidateUser("admin", "asdf123", 0.8, "admin")); 
    personer.add(new ValidateUser("jesper", "ukamm19", 2.5, "user")); 
    personer.add(new ValidateUser("lars", "lol123", 1.5, "user")); 
} 

我想在用户“admin”的改变双值(0.8),例如。 这将从另一个班上完成。 如何做?

提前致谢! :)

+2

这看起来不是多维的。只需遍历列表即可找到该对象。如果你要做很多事情,可以考虑使用地图。 – Zong

+0

正如@ZZhengZhengLi已经说过的,找到列表中的对象并更改它的值。就这样。 – Thomas

+0

我对java很陌生,所以对不起,如果我在多维的术语不正确。 –

回答

1

正如我在我的评论中所述,只是遍历列表来找到对象。如果你要做很多事情,可以考虑使用地图。

for (ValidateUser user : personer) 
    if (user.getName().equals("admin")) 
     user.setNumber(someNumber); 
+0

WOuld不会抛出ConcurrentModificationException? – Adarsh

+0

@Adarsh不,我们正在修改对象,而不是列表。 – Zong

1

首先,请注意,这不是一个多维数组,仅仅是持有ValidateUser类对象引用元素的列表。其次,您需要在更新元素之前访问该元素。您可以通过多种方式来实现:

  1. 实现你的ValidateUserequalshashCode方法,那么就检索列表中的对象:

    ValidateUser adminUser = personer.get(new ValidateUser("admin", "", 0.8, "")); 
    adminUser.set... 
    

    注:这看起来可笑,但将工作(假设您的equals方法仅通过保存此"admin"值的字段进行检查。

  2. 浏览数组并寻找所需的元素手动,然后更新它:

    for (ValidateUser user : personer) { 
        if ("admin".equals(user.getXxx()) { 
         user.set... 
         break; //don't forget this! 
        } 
    } 
    
  3. 使用不同的数据结构像一个Map<String, ValidateUser>来存储你的数据和更快的检索:

    Map<String, ValidateUser> personerMap = new LinkedHashMap<String, ValidateUser>(); 
    personerMap.add("admin", new ValidateUser("admin", ...); 
    //fill the map with other values... 
    //if you still want a Collection<ValidateUser> personer variable 
    Collection<ValidateUser> personer = personerMap.values(); 
    
    //now check for the desired element 
    ValidateUser admin = personerMap.get("admin"); 
    if (admin != null) { 
        admin.set... 
    } 
    

通过的意见,你的ValidateUser是一个不可变的对象,所以你不能使用setter更新它的字段(因为没有)。所以,最好的方法是使用ListIterator<ValidateUser>代替(不要与Iterator混淆),并用您的修改对象替换元素。这里有一个例子:

//the new immutable ValidateUser that will replace the older one... 
//set the parameters as needed 
ValidateUser newAdmin = new ValidateUser("admin", ...); 
ListIterator<ValidateUser> listIterator = personer.listIterator(); 
while (listIterator.hasNext()) { 
    ValidateUser validateUser = listIterator.next(); 
    if ("admin".equals(validateUser.getXxx()) { 
     listIterator.set(newAdmin); 
     break; 
    } 
} 
+0

嗨Luiggi,谢谢你的一个很好的答案。我正在使用选项2,但是.set方法也有问题。 我有一个名为“temp”的双变量,它应该替换内容。我的代码以users.personer.set(i,temp);在我的for循环中,但它给了我错误。问题是什么? –

+0

而不是使用'personer'。set(index,temp)',在你的'personer'列表中找到ValidateUser validateUser对象,然后修改这个'validateUser'对象(使用它的set方法)。 –

+0

我的ValidateUser没有set-method,它们都由ValidateUser中的构造函数设置。 –