Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.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 - Fatal编程技术网

Java 删除“;“洞”;删除项后的数组中

Java 删除“;“洞”;删除项后的数组中,java,Java,我需要从数组中删除一些符合条件的对象 从阵列中移除对象后,我需要阵列没有“孔”,这意味着我需要缩小阵列:不是阵列大小,而是减少其包含的对象数量 移除对象后,如果数组末尾有空值也可以 哪个效率更高 将数组复制到新数组中 迭代数组并将元素移动到通过移除对象创建的“孔”上 我必须使用数组,我不能使用列表实现。使用ArrayList,这将允许您动态更改结构的大小。使用ArrayList,这将允许您动态更改结构的大小。如果您不想使用ArrayList,或者解决方案很好。但不要复制数组,而是创建一个新的空数

我需要从数组中删除一些符合条件的对象

从阵列中移除对象后,我需要阵列没有“孔”,这意味着我需要缩小阵列:不是阵列大小,而是减少其包含的对象数量

移除对象后,如果数组末尾有空值也可以

哪个效率更高

  • 将数组复制到新数组中
  • 迭代数组并将元素移动到通过移除对象创建的“孔”上

  • 我必须使用数组,我不能使用
    列表
    实现。

    使用ArrayList,这将允许您动态更改结构的大小。

    使用ArrayList,这将允许您动态更改结构的大小。

    如果您不想使用ArrayList,或者解决方案很好。但不要复制数组,而是创建一个新的空数组,大小与数组相同,然后将其填充到for循环中。

    如果不想使用ArrayList或解决方案,则可以。但是,不要复制数组,而是创建一个新的空数组,大小与数组相同,然后将其填充到for循环中。

    两种解决方案都是O(N)复杂度,但第一种解决方案需要另一个O(N)内存空间。因此,如果您真的需要处理数组,那么第二个稍微好一点


    如果你在一个需要频繁添加和删除的元素数组中工作,我建议你使用链表实现,这样它可以给你添加和删除数组中任何元素的固定时间。

    < P>你的两个解决方案都是O(N)复杂度,除了第一个需要另一个O(n)内存空间。因此,如果您真的需要处理数组,那么第二个稍微好一点

    如果你在一个需要频繁添加和删除的元素数组中工作,我建议你使用链表实现,这样它可以给你在数组中添加和删除任何元素的固定时间。

    < P > 1)你可以用最后一个元素交换删除的元素,并生成一些类似<代码>大小-< /Cord>< /P> 2) 如果无法交换,则必须多次使用
    System.arraycopy(…)
    方法将阵列的部分复制到新阵列

    public static Object[] deleteElement(Object[] oldArray, int position) {
        Object[] newArray = new Object[oldArray.length - 1];
        System.arraycopy(oldArray, 0, newArray, 0, position);
        System.arraycopy(oldArray, position + 1, newArray, position, newArray.length - position);
        return newArray;
    }
    
    1) 您可以将删除的元素与最后一个元素交换,并生成类似于
    大小--

    2) 如果无法交换,则必须多次使用
    System.arraycopy(…)
    方法将阵列的部分复制到新阵列

    public static Object[] deleteElement(Object[] oldArray, int position) {
        Object[] newArray = new Object[oldArray.length - 1];
        System.arraycopy(oldArray, 0, newArray, 0, position);
        System.arraycopy(oldArray, position + 1, newArray, position, newArray.length - position);
        return newArray;
    }
    

    下面是一个使用
    System.arraycopy
    的简单示例:

        Integer[] i1 = new Integer[] {1, 2, 3, 4, 5};
        Integer[] i2 = new Integer[4];
    
        // Copy everything, except the third value of i1:
        System.arraycopy(i1, 0, i2, 0, 2);
        System.arraycopy(i1, 3, i2, 2, 2);
    
        for (int j : i2)
        {
            System.out.println(j);
        }
    

    下面是一个使用
    System.arraycopy
    的简单示例:

        Integer[] i1 = new Integer[] {1, 2, 3, 4, 5};
        Integer[] i2 = new Integer[4];
    
        // Copy everything, except the third value of i1:
        System.arraycopy(i1, 0, i2, 0, 2);
        System.arraycopy(i1, 3, i2, 2, 2);
    
        for (int j : i2)
        {
            System.out.println(j);
        }
    

    根据您的要求,

    我需要我的阵列没有任何“洞”,所以我需要“缩小”该阵列

    必须创建一个新数组,并将其余对象移动到该数组中。数组是一个固定大小的构造。不能“收缩”数组。只能分配新内存并将元素移动到新阵列


    编辑:您应该修改您的问题,在数组末尾包含关于允许
    null
    的信息。在这种情况下,将元素向后移动1个索引会更好,因为它消除了内存分配(这很昂贵),并且平均会有n/2个操作(假设随机删除),而不是n个。根据您的要求

    我需要我的阵列没有任何“洞”,所以我需要“缩小”该阵列

    必须创建一个新数组,并将其余对象移动到该数组中。数组是一个固定大小的构造。不能“收缩”数组。只能分配新内存并将元素移动到新阵列

    编辑:您应该修改您的问题,在数组末尾包含关于允许
    null
    的信息。在这种情况下,将元素向后移动1个索引会更好,因为它消除了内存分配(这是昂贵的),并且平均会有n/2个操作(假设随机删除),而不是n个伪代码

    • 步骤1:从数组中查找所有与您希望它匹配的对象,并使用唯一值覆盖它们(例如:如果您的数组只包含0或更高的整数,请使用-1覆盖要删除的整数)
    • 步骤1.5:保留一个计数器,记录您所做的移除量
    • 步骤2:创建一个大小为(oldarray.size-counterFromStep1.5)的新数组
    • 步骤3:对于oldarray中每个非空元素(移除整数),将其添加到新数组中
      • 一些伪代码

        • 步骤1:从数组中查找所有与您希望它匹配的对象,并使用唯一值覆盖它们(例如:如果您的数组只包含0或更高的整数,请使用-1覆盖要删除的整数)
        • 步骤1.5:保留一个计数器,记录您所做的移除量
        • 步骤2:创建一个大小为(oldarray.size-counterFromStep1.5)的新数组
        • 步骤3:对于oldarray中每个非空元素(移除整数),将其添加到新数组中

        如果您不想使用arraylist,请创建一个新阵列。在运行时,就地整理现有阵列更有效,但随后会出现空插槽。如果您不想使用arraylist,请创建一个新数组。在运行时,对现有数组进行碎片整理会更有效,但随后会出现空插槽。如果这对你来说没问题的话……如果你仔细想想,数组是一个分配内存的“块”,所以即使你向下移动数据,在最后仍然会存在一个空元素。因此,正如您所建议的,您需要创建一个新的更小的数组,并将项目复制到其中。优雅的Arrays-util类可能有助于确定末尾的所有元素都为null,因为在开始定义数组大小后,里面的所有元素都为null,我只是需要