删除项目后删除数组中的“洞”

时间:2013-11-19 12:36:38

标签: java

如果符合条件,我需要从数组中删除一些对象。

从数组中删除对象后,我需要数组没有“漏洞”,这意味着我需要缩小数组:不是数组大小,而是减少它包含的对象数。

如果在删除对象后数组末尾有空值,则没关系。

哪个更有效率?

  1. 将阵列复制到新阵列
  2. 迭代数组并将元素移到通过移除对象创建的“洞”上
  3. 必须使用数组,我不能使用List实现。

7 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

如果您不想使用ArrayList,则yuor解决方案很好。但是,不是复制数组,而是创建一个具有数组大小的新空数,然后在for循环中填充它。

答案 2 :(得分:2)

1)您可以将删除的元素与最后一个元素交换,并制作类似size--

的内容

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;
}

答案 3 :(得分:2)

根据您的要求,

  

我需要我的阵列没有任何“漏洞”所以我需要“收缩”那个数组,

必须创建一个新数组并将剩余的对象移动到它。数组是固定大小的结构。你不能“收缩”一个数组。您只能分配新内存并将元素移动到新数组。

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

答案 4 :(得分:1)

除了第一个解决方案需要另一个O(N)内存空间外,你的两个解决方案都是O(N)复杂度。因此,如果您真的需要使用Array,那么第二个稍好一些。

如果您正在处理需要在中间频繁添加和删除的元素数组,我建议您使用Linked-List实现,这样它可以为您提供添加和删除数组中任何元素的恒定时间

答案 5 :(得分:1)

以下是使用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);
    }

答案 6 :(得分:1)

一些伪代码

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