【问题标题】:Cannot set ArrayList values [duplicate]无法设置 ArrayList 值 [重复]
【发布时间】:2020-07-05 11:21:15
【问题描述】:

在下面的方法中,我在result.set 遇到"java.lang.IndexOutOfBoundsException: Index: 0, Size: 0" 错误。没有编译错误,但运行后出现此错误。这个数组列表分配有什么问题?我想设置第一个和第二个列表变量。

static List<Integer> compare(List<Integer> a, List<Integer> b) {
    int ca=0;
    int cb=0;
    List<Integer> result = new ArrayList<Integer>();

    for(int i=0; i<a.size(); i++){
        if(a.get(i) > b.get(i)){
            ca++;
        }
        else if(a.get(i) < b.get(i)){
            cb++;
        }
    }
    result.set(0, ca);
    result.set(1, cb);
    return result;
}

【问题讨论】:

  • set()更改为add()
  • @Eran 非常感谢。但是更新数组列表中第一个元素的值呢?假设我将其设置为 0,然后更新为 3,我该怎么做?
  • @Eran 另一方面,我应该在定义数组列表时定义它的大小吗?如果是这样,我可以将其设置为List&lt;Integer&gt; result = new ArrayList&lt;Integer&gt;(2); 吗?
  • 如果 List > 索引的大小,您可以使用set(index,value),但在您的示例中并非如此。
  • 谢谢,但我已经将set(index,value) 用作result.set(0, ca),但会抛出错误。那么,如何设置第一个索引以及我的实现有什么问题?

标签: java list arraylist


【解决方案1】:

set 方法用于替换列表中现有的对象。

参考set docs

用指定元素替换此列表中指定位置的元素(可选操作)。”

在这种情况下,您应该使用add(ca) 而不是set(0, ca)

【讨论】:

  • 谢谢,我知道了,有时我需要替换/更新值。那么,在那种情况下我该如何使用 set 方法呢?
  • 在您的代码中,您正在初始化空列表 result 并向其中添加两个对象。没有理由在该用例中使用set。随便玩add() :)
  • 我知道,但我只想知道如何设置第一个和第二个列表变量。我应该设置大小等,如List&lt;Integer&gt; result = new ArrayList&lt;Integer&gt;(2);(通过在括号中使用 2)?
  • 第一次使用add() List 知道您想将数据放在列表的第一个索引中。当您第二次调用add() 时,下一个项目将被放置在第二个位置。您提到的数字2 是数组的容量。它在 Java 中默认处理,您无需担心。它会在需要时重新计算容量(它的容量会加倍)。
  • 谢谢,但我已经将set(index,value) 用作result.set(0, ca),但会抛出错误。那么,如何设置第一个索引以及我的实现有什么问题?
【解决方案2】:

java.util.ArrayList.set(int index, E element)用指定元素替换这个列表中指定位置的元素。

结果arrayList 的大小为零。因此,替换 0 索引处的元素会引发错误。 使用 result.add(ca); result.add(cb); 或者使用 HashMap 来存储 ca 和 cb 的计数,以后使用 key 很容易检索到各自的计数。

【讨论】:

  • 是否可以在不使用添加方法的情况下设置列表的大小,即List&lt;Integer&gt; result = new ArrayList&lt;Integer&gt;(2);(通过在括号中使用 2)?
  • 您将数组列表的大小与其容量混淆了:大小是列表中元素的数量;容量是列表可以容纳多少元素而不重新分配其内部结构。当您调用 new ArrayList(10) 时,您正在设置列表的初始容量,而不是其大小。换句话说,当以这种方式构造时,数组列表开始它的生命是空的。将十个元素添加到数组列表的一种方法是使用循环: for (int i = 0; i
  • 精彩的解释,现在我已经澄清了这个问题。非常感谢。
猜你喜欢
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多