我该如何从数组中删除一个元素,然后将数组大小调整为更小的尺寸呢?同样地,如果我需要添加另一个元素,如何增加数组的容量?
System.arraycopy(...)
或Arrays.copyOf(...)
等方法进行复制,虽然循环复制也能实现,但可能会显得有些笨重。null
替换它们),则需要分配一个新的较小数组,并复制要保留的元素。null
来“擦除”引用类型数组中的元素。但这会带来新的问题:null
元素表示某些含义,则无法这样做。
- 使用该数组的所有代码都必须以适当的方式处理可能存在的null
元素。这会增加复杂性并导致出现潜在错误。ArrayUtils
),但您可能需要考虑是否值得添加库依赖仅仅是为了实现自己可以用5-10行代码实现的方法。List
类而不是数组,这样会更简单(在许多情况下还更高效)。List
类可以处理至少数组所能处理的“增长”,而且还有一些操作可用于在列表的任何位置插入和删除元素。ArrayList
类使用一个数组作为后备存储,并根据需要自动扩展数组。它不会自动减小后备数组的大小,但您可以使用trimToSize()
方法进行调整。ArrayList l = ...
l.remove(21);
l.trimToSize(); // Only do this if you really have to.
1- 注意,显式的if (a[e] == null)
检查本身很可能是"免费的",因为它们可以与当你引用a[e]
的值时发生的隐式null
检查结合起来。
2- 我说它在许多情况下更有效率,因为ArrayList
使用一个简单的“加倍大小”策略来增长支持数组。这意味着如果通过重复追加来增加列表,则每个元素平均会额外复制一次。相比之下,如果你使用数组来做到这一点,你将平均要拷贝每个数组元素近N/2次。
你无法直接改变数组的大小,但是你可以创建一个新的数组并使用某些实用函数有效地将旧数组中的元素复制到新数组中,例如:
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;
}
然而,更好的方法是使用ArrayList(或类似的List结构)来存储您的数据,然后使用它的方法根据需要删除元素。
使用org.apache.commons.lang中的ArrayUtils.removeElement(Object[],Object)
是迄今为止最简单的方法来实现这一点。
int[] numbers = {1,2,3,4,5,6,7};
//removing number 1
numbers =(int[])ArrayUtils.removeElement(numbers, 1);
由于数组在创建时分配了固定的大小,因此您唯一的选择是创建一个新数组,而不包含要删除的元素。
如果要删除的元素是最后一个数组项,则可以使用Arrays.copy
轻松实现:
int a[] = { 1, 2, 3};
a = Arrays.copyOf(a, 2);
object[] newarray = new object[oldarray.Length-1];
for(int x=0; x < array.Length; x++)
{
if(!(array[x] == value_of_array_to_delete))
// if(!(x == array_index_to_delete))
{
newarray[x] = oldarray[x];
}
}
创建数组后无法缩小其大小,但可以将其内容复制到另一个较小的数组中。
object[] new array = new object[oldarray.Length-2];
,for循环会处理增量。 - Mike我创建了这个函数或类,我有点新手,但我的朋友也需要它,所以我创建了它:
public String[] name(int index, String[] z ){
if(index > z.length){
return z;
} else {
String[] returnThis = new String[z.length - 1];
int newIndex = 0;
for(int i = 0; i < z.length; i++){
if(i != index){
returnThis[newIndex] = z[i];
newIndex++;
}
}
return returnThis;
}
}
由于它相当相关,我想在这里发布它。
如果不使用System.arraycopy方法,您可以使用以下方法从数组中删除元素
int i = 0;
int x = 0;
while(i < oldArray.length){
if(oldArray[i] == 3)i++;
intArray[x] = oldArray[i];
i++;
x++;
}
其中3是您想要删除的值。
不使用任何预定义函数,同时保证效率: --- >>
public static void Delete(int d , int[] array )
{
Scanner in = new Scanner (System.in);
int i , size = array.length;
System.out.println("ENTER THE VALUE TO DELETE? ");
d = in.nextInt();
for ( i=0;i< size;i++)
{
if (array[i] == d)
{
int[] arr3 =new int[size-1];
int[] arr4 = new int[i];
int[] arr5 = new int[size-i-1];
for (int a =0 ;a<i;a++)
{
arr4[a]=array[a];
arr3[a] = arr4[a];
}
for (int a =i ;a<size-1;a++)
{
arr5[a-i] = array[a+1];
arr3[a] = arr5[a-i];
}
System.out.println(Arrays.toString(arr3));
}
else System.out.println("************");
}
}