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中每个非空元素(移除整数),将其添加到新数组中
- 一些伪代码