Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从数组中删除项并收缩数组_Java_Arrays_Resize - Fatal编程技术网

Java 从数组中删除项并收缩数组

Java 从数组中删除项并收缩数组,java,arrays,resize,Java,Arrays,Resize,如何从数组中删除项目,然后将数组大小调整为较小的大小? 同样,如果需要添加其他项目,如何增加容量?阵列的大小是固定的,创建阵列后无法调整其大小。通过将现有项设置为null,可以删除该项: objects[4] = null; 但您将无法从阵列中删除整个插槽并将其大小减少1 如果需要动态调整大小的数组,可以使用ArrayList。有了它,您可以创建新的数组,并使用一些实用功能将元素从旧数组高效地复制到新数组中,例如: public static int[] removeElement(int[]

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

阵列的大小是固定的,创建阵列后无法调整其大小。通过将现有项设置为
null
,可以删除该项:

objects[4] = null;
但您将无法从阵列中删除整个插槽并将其大小减少1


如果需要动态调整大小的数组,可以使用
ArrayList
。有了它,您可以创建新的数组,并使用一些实用功能将元素从旧数组高效地复制到新数组中,例如:

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;
}
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];
   }
}
但是,更好的方法是使用ArrayList(或类似的列表结构)存储数据,然后根据需要使用其方法删除元素;
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];
   }
}
for(int x=0;x
创建数组后无法缩小其大小,但可以将内容复制到另一个较小的数组。

Java数组的大小在分配时是固定的,不能更改

  • 如果要“增长”或“收缩”现有阵列,则必须分配一个适当大小的新阵列并复制阵列元素;e、 g.使用
    System.arraycopy(…)
    Arrays.copyOf(…)
    。复制循环也可以工作,尽管它看起来有点笨重。。。国际海事组织

  • 如果您想从数组中“删除”一个或多个项目(真正意义上…不只是将其替换为
    null
    ),则需要分配一个新的较小数组并跨要保留的元素进行复制

  • 最后,通过将
    null
    赋值给引用类型数组中的元素,可以“擦除”该元素。但这带来了新的问题:

    • 如果您使用
      null
      元素来表示某事,则不能这样做
    • 现在,所有使用数组的代码都必须以适当的方式处理
      null
      元素的可能性。更复杂,更可能出现错误1

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


使用
列表
类而不是数组更好(即更简单……在许多情况下,效率更高2)。这将负责(至少)增加备份存储。还有一些操作负责在列表中的任何位置插入和删除元素

例如,
ArrayList
类使用数组作为支持,并根据需要自动增长数组。它不会自动减小备份阵列的大小,但您可以使用
trimToSize()
方法告诉它这样做;e、 g

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次。

如果不使用System.arraycopy方法,则可以使用以下命令从数组中删除元素

    int i = 0;
    int x = 0;
    while(i < oldArray.length){
        if(oldArray[i] == 3)i++;

        intArray[x] = oldArray[i];
        i++;
        x++;
    }
inti=0;
int x=0;
while(i

其中3是要删除的值。

使用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);

我已经创建了这个函数或类。我有点新,但我的朋友也需要这个,所以我创建了这个:

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; 
    }
}
公共字符串[]名称(int索引,字符串[]z){
如果(索引>z长度){
返回z;
}否则{
String[]returnThis=新字符串[z.length-1];
int newIndex=0;
对于(int i=0;i

因为它非常有趣,我想我会把它贴在这里。

因为数组在创建时有一个固定大小的分配,所以您唯一的选择就是创建一个新数组,而不包含要删除的元素

如果要删除的元素是最后一个数组项,则可以使用
数组轻松实现。复制

int a[] = { 1, 2, 3};
a = Arrays.copyOf(a, 2);
运行上述代码后,a现在将指向一个只包含1,2的新数组

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


上述方法效率不高。如果需要管理内存中项目的可变列表,最好使用列表。具体来说,
LinkedList
将从
O(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();

    }

}
包装样品;
酒吧