如果符合条件,我需要从数组中删除一些对象。
从数组中删除对象后,我需要数组没有“漏洞”,这意味着我需要缩小数组:不是数组大小,而是减少它包含的对象数。
如果在删除对象后数组末尾有空值,则没关系。
哪个更有效率?
我必须使用数组,我不能使用List
实现。
答案 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)
一些伪代码