【问题标题】:Change value of multidimensional ArrayList改变多维ArrayList的值
【发布时间】:2013-11-22 15:23:22
【问题描述】:

我需要一种解决方案来更改 Java 中多维 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)。 这将在另一个类中完成。 该怎么做?

提前致谢! :)

【问题讨论】:

  • 这看起来不是多维的。只需遍历列表即可找到对象。如果您要经常这样做,请考虑使用地图。
  • 正如@ZongZhengLi 已经说过的,在列表中定位对象并更改其值。就是这样。
  • 我对java很陌生,如果我在多维方面不正确,请见谅。
  • 不是问题,只需使用列表的 get 方法并更改您获得的对象的值.. :)

标签: java multidimensional-array arraylist


【解决方案1】:

正如我在评论中所说,只需遍历列表即可找到对象。如果您要经常这样做,请考虑使用地图。

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

【讨论】:

  • 这不会抛出 ConcurrentModificationException 吗?
  • @Adarsh 不,我们正在修改对象,而不是列表。
【解决方案2】:

首先,请注意这不是一个多维数组,它只是一个包含ValidateUser 类对象引用元素的列表。其次,您需要在更新之前访问该元素。您有几种方法可以做到这一点:

  1. ValidateUser 类中实现equalshashCode 方法,然后从列表中检索对象:

    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&lt;String, ValidateUser&gt; 等不同的数据结构来存储您的数据并加快检索速度:

    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...
    }
    

对于 cmets,您的 ValidateUser 是一个不可变对象,因此您无法使用设置器更新其字段(因为没有设置器)。因此,这里最好的方法是改用ListIterator&lt;ValidateUser&gt;(不要与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;
    }
}

【讨论】:

  • 嗨 Luiggi,感谢您的出色回答。我将使用选项 2,但 .set 方法也有问题。我有一个名为“temp”的双变量,它应该替换内容。我的代码是 users.personer.set(i, temp);在我的 for 循环中,但它给了我错误。有什么问题?
  • 不要使用personer.set(index, temp),而是在personer 列表中找到ValidateUser validateUser 对象,然后修改这个validateUser 对象(通过使用它的set 方法)。
  • 我的 ValidateUser 没有设置方法,它们都是由 ValidateUser 中的构造函数设置的。
  • @JesperBaungårdBruunHansen 您必须在问题中注意这一点。我会相应地更新我的答案。
  • 是的,我的错。我对这段代码很迷茫,非常感谢您的帮助! :)
猜你喜欢
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 2019-01-25
  • 2014-12-21
  • 2023-03-11
相关资源
最近更新 更多