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

时间:2011-02-02 02:24:02

标签: java arrays resize

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

10 个答案:

答案 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("************");    


        }

}