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
- 现在,所有使用数组的代码都必须以适当的方式处理
元素的可能性。更复杂,更可能出现错误1null
- 如果您使用
有第三方库形式的替代品(例如Apache Caluns
使用
列表
类而不是数组更好(即更简单……在许多情况下,效率更高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();
}
}
包装样品;
酒吧