如何从数组中删除项目,然后将数组调整为较小的尺寸? 同样,如果我需要添加其他项目,如何增加容量呢?
答案 0 :(得分:25)
Java数组的大小在分配时是固定的,并且无法更改。
如果要“增长”或“缩小”现有数组,则必须分配适当大小的新数组并复制数组元素;例如使用System.arraycopy(...)
或Arrays.copyOf(...)
。复制循环也可以,虽然它看起来有点笨重...... IMO。
如果你想从一个数组中“删除”一个或多个项目(真正意义上......不只是用null
替换它们),你需要分配一个新的更小的数组并复制跨越您想要保留的元素。
还有第三方库形式的替代品(例如Apache Commons ArrayUtils
),但您可能想要考虑是否值得添加库依赖只是您可以用5-10行代码实现自己的方法。
使用List
类而不是数组更好(即更简单......并且在许多情况下,更有效 1 )。这将照顾(至少)增长后备存储。并且有些操作负责在列表中的任何位置插入和删除元素。
例如,ArrayList
类使用数组作为后备,并根据需要自动增长数组。它不会自动减小后备阵列的大小,但您可以使用trimToSize()
方法告诉它执行此操作; e.g。
ArrayList l = ...
l.remove(21);
l.trimToSize(); // Only do this if you really have to.
1 - 我说它“在许多情况下更有效”,因为ArrayList
在需要增长后备阵列时使用简单的“双倍大小”策略。这意味着如果通过重复追加来增加列表,则每个元素将平均复制一次。相比之下,如果使用数组执行此操作,则最终会将每个数组元素平均复制接近N / 2次。
答案 1 :(得分:17)
您本身无法调整数组大小,但您可以创建一个新数组,并使用以下实用函数有效地将旧数组中的元素复制到新数组中:
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结构)来存储数据,然后根据需要使用其方法删除元素。
答案 2 :(得分:12)
使用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);
答案 3 :(得分:4)
由于数组具有在创建时分配的固定大小,因此您唯一的选择是创建一个没有要删除的元素的新数组。
如果要删除的元素是最后一个数组项,则使用Arrays.copy
可以轻松实现:
int a[] = { 1, 2, 3};
a = Arrays.copyOf(a, 2);
运行上面的代码之后,a将指向一个只包含1,2的新数组。
否则,如果要删除的元素不是最后一个元素,则需要创建一个大小为1的新数组,并将除了要删除的项目之外的所有项目复制到该数组。
上述方法效率不高。如果您需要在内存中管理可变项目列表,请更好地使用List。具体来说,LinkedList
会从O(1)
中的列表中删除项目(理论上可能最快)。
答案 4 :(得分:2)
我创建了这个函数或类。我有点新,但我的朋友也需要这个,所以我创造了这个:
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;
}
}
由于它很漂亮,我以为我会把它发布在这里。
答案 5 :(得分:1)
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];
}
}
创建数组后无法缩小数组的大小,但您可以将内容复制到另一个较小的数组。
答案 6 :(得分:0)
阵列大小固定,创建后无法调整大小。您可以通过将现有项目设置为null
来删除现有项目:
objects[4] = null;
但是你将无法从阵列中删除整个插槽并将其大小减小1。
如果您需要动态大小的数组,则可以使用ArrayList
。有了它,您可以add()
和remove()
个对象,它会根据需要增长和缩小。
答案 7 :(得分:0)
不使用System.arraycopy方法,您可以使用以下
从数组中删除元素 int i = 0;
int x = 0;
while(i < oldArray.length){
if(oldArray[i] == 3)i++;
intArray[x] = oldArray[i];
i++;
x++;
}
其中3是您要删除的值。
答案 8 :(得分:-1)
您可以在创建数组时通过增加数组的大小来扩展数组,也可以在创建后更改大小,但可以缩小或删除元素。没有创建新数组的替代解决方案可能是:
package sample;
public class Delete {
int i;
int h=0;
int n=10;
int[] a;
public Delete()
{
a = new int[10];
a[0]=-1;
a[1]=-1;
a[2]=-1;
a[3]=10;
a[4]=20;
a[5]=30;
a[6]=40;
a[7]=50;
a[8]=60;
a[9]=70;
}
public void shrinkArray()
{
for(i=0;i<n;i++)
{
if(a[i]==-1)
h++;
else
break;
}
while(h>0)
{
for(i=h;i<n;i++)
{
a[i-1]=a[i];
}
h--;
n--;
}
System.out.println(n);
}
public void display()
{
for(i=0;i<n;i++)
{
System.out.println(a[i]);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Delete obj = new Delete();
obj.shrinkArray();
obj.display();
}
}
请评论任何错误!!
答案 9 :(得分:-2)
不使用任何预定义的功能以及有效的:---&gt;&gt;
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("************");
}
}