假设我有一个二维数组,例如String array[][] = {{"",""},{"",""}},此数组将在新行中打印出每一行。

现在,我的问题是,如果用户想通过Scanner输入使用一组新的行将其添加到该数组中,我该怎么做?

例如,假设我有一个库存清单,而我刚发现有新货到达。如何将此新库存添加到现有库存中。


  我当时想的是,如果我的数组不够大,那么我将不得不制作一个更大的新数组,然后将原始数据复制到那里。至此,我可以添加新数据了。所以我在想几个for循环就足够了。但是我不知道如何在这里应用它?

最佳答案

是的,您可以通过调用Arrays.copyOf方法,然后将其重新分配给初始对象来增加数组的大小。但是无论如何,如果您不想一次又一次地复制ArrayList是一个更好的选择,因为当您在内部调用add(E e)时,它内部使用Arrays.copyOf来增加Array的大小,因为它是内部执行的:

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}


ensureCapacityInternal(size + 1)检查分配给size + 1的默认容量的最大值,即10,如下所示:

private void ensureCapacityInternal(int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    ensureExplicitCapacity(minCapacity);
}


如果容量超过ensureExplicitCapacity(minCapacity);,则调用它,通过调用内部执行transient Object[]grow()来增加Arrays.copyOf的容量。
希望这种解释有所帮助。

对于您的问题,您可以执行以下操作:

String array[][] = { { "hello", "how" }, { "are", "you" } };
Scanner scan = null;
String str = null;
int len = array.length;
int i = 0;
while (i != 6) { // provide the loop as you require
    scan = new Scanner(new InputStreamReader(System.in));
    str = scan.next();
    try {
        array[len][1] = str; // will try to add to second position. If array is out of index an exception will be thrown
        len++; // won't increase if exception is thrown
    } catch (ArrayIndexOutOfBoundsException e) {
        array = Arrays.copyOf(array, len + 1); // copying the array
        array[len] = new String[2]; // creating and assigning string array to new row else it will be null
        array[len][0] = str; // adding new string to new array position
    }
    i++;
}
scan.close();

for (String[] strings : array) {
    for (String string : strings) {
        System.out.println(string);
    }
}

10-05 21:12
查看更多