我有一个包含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]
怎么了?我该如何解决这个问题?
答案 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);