1

这是我目前在一个项目上的进展。我正在尝试实现这个 ArrayList 的东西,但文件继续抛出相同的异常。

import java.util.*;

   public class Numerican{

      public static void main( String [] args ){

        Scanner input = new Scanner(System.in);

        ArrayList<Integer> array = new ArrayList<Integer>(10);

        int count = input.nextInt() * 2;

        while (count > 0){
           array.add( 0 );
           count = count - 1;
           array.add(count, 2);
        }

        array.add(2, input.nextInt());
        System.out.println(array.get(2));

      }
   }

我的理解是= new ArrayList<Integer>(10);将数组大小设置为 10。我做错了什么吗?

4

6 回答 6

7
= new ArrayList<Integer>(10);

这一行将 CAPACITY 初始化为 10,这意味着内存是在后端分配的,但就您而言,数组仍然是空的。

Javadoc -

public ArrayList(int initialCapacity)
    Constructs an empty list with the specified initial capacity.

这就是add如果您尝试添加超出ArrayList.

ps 请记住add,在使用 2 参数变体时,函数先获取索引,然后再获取元素。

编辑:

ArrayList 有 2 个不同的成员变量,sizecapacity。容量是分配了多少内存,大小是程序员插入了多少元素。

这里,容量 = 10,大小 = 0;

于 2013-02-22T05:21:09.140 回答
0

如果索引超出范围 (index < 0 || index > size()) 将抛出 IndexOutOfBoundsException。
所以我认为您正在访问列表的 index > size() 。

size() ===> 返回此列表中的元素数。

array.add(2, input.nextInt()); 当您的列表大小为 1 时,这是可能的例外...

于 2013-02-22T05:21:49.077 回答
0

根据javadocs

构造一个具有指定初始容量的空列表。

请注意,ArrayList 是的(即不包含任何项目)。该值表示 ArrayList 的容量,即在必须分配更多内存之前可以添加的元素数。

另一方面,调用add()实际上将一个项目添加到 ArrayList。在您的示例中,在列表末尾array.add( 0 );添加a并在 index 处添加 a 。我怀疑问题在于这不是您的. 您应该通过插入 SOP 或使用调试器来检查它的值。0array.add(count, 2);2countcountArrayList

于 2013-02-22T05:22:07.737 回答
0

嘿,您的问题似乎是因为这条线

array.add(count, 2); 

在索引计数处添加 2

例如,您的输入大小为 5,那么array.add(9,2);到那时数组大小仅为 1,因为容量和大小是 ArrayList 的两个不同参数。所以你可以使用 for 循环而不是 while 来插入你的值

for(int i=0; i<count;i++)
{
array.add(i,2);
}
于 2013-02-22T05:35:52.027 回答
0

count maybe >= 10,也许源代码可以回答你的问题:

public void add(int index, E element) {
    rangeCheckForAdd(index);

    ensureCapacityInternal(size + 1);  // Increments modCount!!
    System.arraycopy(elementData, index, elementData, index + 1,
                     size - index);
    elementData[index] = element;
    size++;
}

rangeCheckForAdd():

/**
 * A version of rangeCheck used by add and addAll.
 */
private void rangeCheckForAdd(int index) {
    if (index > size || index < 0)
        throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
于 2013-02-22T05:35:56.900 回答
0

根据我对 ArrayList 的理解,您需要将项目添加到顺序索引中的列表中。
即如果没有填写1到6,则不能将项目添加到第7个索引位置。

ArrayList.add(indexPosition, element);

如果您将元素添加到列表中,从 indexPosition 0 开始,并且每次将 indexPosition 增加 1,它应该可以工作。

前任。
int i = 0;
(while i < 10){
array.add(i, numberToAdd);
i++;
}

于 2013-02-22T05:46:13.530 回答