最近在使用arrayList时我发现了一个奇怪的问题。我想在arraylist中保留2个元素,并希望将object1保留在element1中的元素0和object2中。
我在循环中决定这一点。
当碰巧添加第一个元素时抛出indexOutofBounds。根据java doc,索引大于它执行此操作的大小。
public static void main(String[] args)
{
ArrayList<String> list = new ArrayList<String>();
list.add(1,"SECONDITEM"); // throwing due to size is not set
list.add(0,"FIRSTITEM");
int postn=0;
for(String item:list){
System.out.println("Position "+postn+" :"+item);
postn++;
}
}
然后我尝试将其他项目设置为0,1元素中的占位符并尝试执行相同的
public static void main(String[] args)
{
ArrayList<String> list = new ArrayList<String>();
list.add(0,"x");
list.add(1,"y");
list.add(1,"SECONDITEM");
list.add(0,"FIRSTITEM");
int postn=0;
for(String item:list){
System.out.println("Position "+postn+" :"+item);
postn++;
}
}
Output:
Position 0 :FIRSTITEM
Position 1 :x
Position 2 :SECONDITEM
Position 3 :y
public static void main(String[] args)
{
ArrayList<String> list = new ArrayList<String>();
list.add(0,"x");
list.add(1,"y");
list.remove(1);
list.add(1,"SECONDITEM");
list.remove(0);
list.add(0,"FIRSTITEM");
int postn=0;
for(String item:list){
System.out.println("Position "+postn+" :"+item);
postn++;
}
}
Position 0 :FIRSTITEM
Position 1 :SECONDITEM
答案 0 :(得分:4)
.add()方法在给定位置插入元素并相应地移动其他元素
要覆盖特定索引处的值,您必须使用 .set(位置,值)
尝试set方法..
list.add(0,"x");
list.add(1,"y");
list.set(1,"SECONDITEM");
list.set(0,"FIRSTITEM");
现在它将只返回两个值。
答案 1 :(得分:0)
当你按此顺序打电话时:
ArrayList<String> list = new ArrayList<String>();
list.add(1,"SECONDITEM"); // throwing due to size is not set
您正在尝试添加到位置“1”,但尚未添加任何内容。我相信这就是你得到错误的原因。相反,你可能只想使用:
ArrayList<String> list = new ArrayList<String>();
list.add("FIRSTITEM");
因为它是一个空列表。您也可以使用索引,但每次都必须增加。有意义吗?
答案 2 :(得分:0)
问题是......你试图以一种不打算使用的方式使用List
。如您所知,您无法设置或添加超出当前大小范围的索引。
如果您事先知道所需尺寸并且尺寸固定,那么使用String[]
是更好的选择。
如果你真的想要/需要一个允许随机访问集的动态结构而不管当前的大小,那么在需要时编写自己的方法来填充列表:
public static <T> void fillAndSet(int index, T object, List<T> list)
{
if (index > (list.size() - 1))
{
for (int i = list.size(); i < index; i++)
{
list.add(null);
}
list.add(object);
}
else
{
list.set(index, object);
}
}