将值分配给列表时遇到错误

时间:2018-11-24 10:12:13

标签: java list

我有一个包含3个元素的列表。它处于while循环中,我想在每次迭代中覆盖其值。这是代码:

private List<Integer> loadList = new ArrayList<>(3);
.
.
.
while(counter < 10) {
    loadList.add(0, taskNum);
    loadList.add(1, taskNum);
    loadList.add(2, taskNum);
    .
    .
    .
    counter++;
}

但是在运行代码之后,我意识到覆盖并没有发生,并且每次将新元素添加到列表的末尾。例如:

  

首先:a = [1 2 3]

     

然后:a = [1 2 3 4 5 6],但我希望它像a = [4 5 6]

因此,我将代码更改为以下内容:

loadList = new ArrayList<>(3);
//initializing
loadList.add(0, 0);
loadList.add(1, 0);
loadList.add(2, 0);
while(counter < 10) {
    loadList.set(0, taskNum);
    loadList.set(1, taskNum);
    loadList.set(2, taskNum);
    .
    .
    .
    counter++;
}

但是现在我遇到了这个错误:

2018-11-24 13:27:38.298 ERROR [n.f.core.Main] Exception in main
java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    at java.util.ArrayList.rangeCheck(ArrayList.java:657) ~[na:1.8.0_151]
    at java.util.ArrayList.set(ArrayList.java:448) ~[na:1.8.0_151]
    at net.floodlightcontroller.mactracker.Mactracker.paramInit(Mactracker.java:137) ~[floodlight.jar:1.2-SNAPSHOT]
    at net.floodlightcontroller.mactracker.Mactracker.init(Mactracker.java:205) ~[floodlight.jar:1.2-SNAPSHOT]
    at net.floodlightcontroller.core.module.FloodlightModuleLoader.initModules(FloodlightModuleLoader.java:460) ~[floodlight.jar:1.2-SNAPSHOT]
    at net.floodlightcontroller.core.module.FloodlightModuleLoader.loadModulesFromList(FloodlightModuleLoader.java:295) ~[floodlight.jar:1.2-SNAPSHOT]
    at net.floodlightcontroller.core.module.FloodlightModuleLoader.loadModulesFromConfig(FloodlightModuleLoader.java:235) ~[floodlight.jar:1.2-SNAPSHOT]
    at net.floodlightcontroller.core.Main.main(Main.java:61) ~[floodlight.jar:1.2-SNAPSHOT]

怎么了?我该如何解决这个问题?

5 个答案:

答案 0 :(得分:5)

此行:

loadList = new ArrayList<>(3);

您定义列表的初始容量为3。
现在,您不仅可以添加3,还可以添加任意数量的项目。
但是您的清单仍然是空的。
您不能使用:

loadList.set(2, taskNum);

如果3d位置没有物品。
set(position, item)仅在position处已有项目时有效。
因此,使用add(item)在列表末尾添加新项目
set(position, item)替换position列表中已经存在的项目。
您还可以使用add(position, item)position处插入新项目,并将项目从该position移到右侧。

答案 1 :(得分:2)

当您试图在大于列表大小的索引处设置值时,将得到IndexOutOfBoundsException

loadList.add(0, 0);
loadList.add(1, 0);
loadList.set(2, 0); <--------------- You will get IndexOutOfBound here

如果索引超出范围List#set,则(index < 0 || index > size()方法将引发异常。使用loadList.add(2, 0)代替loadList.set(2, 0);可以解决您的问题。

答案 2 :(得分:1)

像这样初始化时,

loadList.add(0, 0);
loadList.add(1, 0);
loadList.set(2, 0); <--- here you are setting instead of adding the value :)

应更改为

loadList.add(0, 0);
loadList.add(1, 0);
loadList.add(2, 0);

答案 3 :(得分:1)

得到IndexOutOfBoundsException是因为您将对象设置为尚未定义的特定索引。

loadList = new ArrayList<>(3); menas your arryList have initial capacity 3.

首先,您必须在位置添加元素,然后设置元素。试试这个

loadList.add(0, 0);
loadList.add(1, 0);
loadList.add(2, 0);

答案 4 :(得分:1)

一个例子,这会给你一个主意。

$ids = explode(',',$testing->user_ids);
$users = Users::whereIn('id',$ids)->pluck('name');
$usersName = implode(',',$users);