从数组和缩小数组中删除项目

Joe*_*Joe 34 java arrays resize

如何从数组中删除项目,然后将数组调整为较小的大小?同样,如果我需要添加其他项目,如何增加容量?

Ste*_*n C 25

分配Java数组时,Java数组的大小是固定的,无法更改.

  • 如果要"增长"或"缩小"现有数组,则必须分配适当大小的新数组并复制数组元素; 例如使用System.arraycopy(...)Arrays.copyOf(...).复制循环也可以,虽然它看起来有点笨重...... IMO.

  • 如果你想从一个数组中"删除"一个或多个项目(真正意义上的......不仅仅是替换它们null),你需要分配一个新的较小的数组并复制你想要保留的元素.

有第三方库形式的替代品(例如Apache Commons ArrayUtils),但您可能想要考虑是否值得添加库依赖项只是为了您可以用5-10行代码实现自己的方法.


使用类而不是数组更好(即更简单......在许多情况下,效率更高1)List.这将照顾(至少)增长后备存储.并且有一些操作负责在列表中的任何位置插入和删除元素.

例如,ArrayList该类使用数组作为后备,并根据需要自动增长数组.它不会自动减小后备阵列的大小,但您可以告诉它使用该trimToSize()方法执行此操作; 例如

ArrayList l = ...
l.remove(21);
l.trimToSize();  // Only do this if you really have to.
Run Code Online (Sandbox Code Playgroud)

1 - 我说它"在许多情况下更有效",因为ArrayList当需要增长后备阵列时,使用简单的"双倍大小"策略.这意味着如果通过重复追加来增加列表,则每个元素将平均复制一次.相比之下,如果您使用数组执行此操作,则最终会将每个数组元素平均复制接近N/2次.


Mar*_*iot 18

您本身无法调整数组大小,但您可以创建一个新数组,并使用以下实用函数有效地将元素从旧数组复制到新数组:

public static int[] removeElement(int[] original, int element){
    int[] n = new int[original.length - 1];
    System.arraycopy(original, 0, n, 0, element );
    System.arraycopy(original, element+1, n, element, original.length - element-1);
    return n;
}
Run Code Online (Sandbox Code Playgroud)

但是,更好的方法是使用ArrayList(或类似的List结构)来存储数据,然后使用其方法根据需要删除元素.


azr*_*lAT 12

使用ArrayUtils.removeElement(Object[],Object)org.apache.commons.lang是迄今为止最简单的方法.

int[] numbers = {1,2,3,4,5,6,7};
//removing number 1
numbers =(int[])ArrayUtils.removeElement(numbers, 1);
Run Code Online (Sandbox Code Playgroud)

  • 这并没有真正调整数组的大小.它创造了一个新的.但没有其他办法,因为数组的大小无法改变. (2认同)

Guy*_*Guy 5

由于数组具有在创建时分配的固定大小,因此唯一的选择是创建一个新数组而没有要删除的元素。

如果要删除的元素是最后一个数组项,则可以使用Arrays.copy以下命令轻松实现:

int a[] = { 1, 2, 3};
a = Arrays.copyOf(a, 2);
Run Code Online (Sandbox Code Playgroud)

运行上面的代码后,a现在将指向仅包含1、2的新数组。

否则,如果要删除的元素不是最后一个,则需要以size-1创建一个新数组,并将除要删除的元素之外的所有项目复制到该数组中。

上面的方法效率不高。如果您需要管理内存中可变的项目列表,最好使用列表。具体来说,LinkedList将在列表中删除一项O(1)(理论上最快)。


Bol*_*ock 1

数组的大小是固定的,创建后无法调整它们的大小。您可以通过将现有项目设置为null

objects[4] = null;
Run Code Online (Sandbox Code Playgroud)

但您无法从数组中删除整个槽并将其大小减少 1。

如果需要动态大小的数组,可以使用ArrayList. 有了它,您就可以add()remove()对象一起使用,它会根据需要增大和缩小。