我有两个代码用于删除数组中的元素,但这两个for循环for(int k=i;k< l-1;k++)
只有一个区别
而for(int k =i;k< l;k++)
首先我们正在减少阵列长度的大小,但在第二个我们不是。这两个代码都是相同的,并且删除工作正常。但我无法发挥作用。
第一
import java.util.Scanner;
public class SearchDeletion1 {
public static void main(String[] args) {
int []a = new int[10];
a[0]=33;
a[1]=11;
a[2]=22;
a[3]=333;
a[4]=343;
a[5]=233;
a[6]=373;
a[7]=3223;
a[8]=313;
a[9]=332;
int i;
System.out.println();
int l=a.length;
Scanner s = new Scanner(System.in);
System.out.println("Enter the item to be searched");
int e = s.nextInt();
//searching
for(i=0;i<l;i++)
if(a[i]==e)
break;
if(i==a.length)
System.out.println("couldn't found");
else
System.out.println("found at position "+"a["+i+"]");
//deleting
for(int k=i;k<l-1;k++)
a[k]=a[k+1];
l--;
System.out.println("item deleted and new array");
for(int q=0;q<l;q++){
System.out.println("a["+q+"]"+"="+a[q]);
}
}
}
第二
import java.util.Scanner;
public class SearchDeletion2 {
private int a[] ;
SearchDeletion2(int size){
a =new int[size];
}
public void set(int index,int elem){
a[index]=elem;
}
public int get(int index){
return a[index];
}
public static void main(String[] args) {
SearchDeletion2 arr = new SearchDeletion2(100);
arr.set(0,33);
arr.set(1,22);
arr.set(2,11);
arr.set(3,99);
arr.set(4,66);
arr.set(5,44);
arr.set(6,77);
arr.set(7,88);
arr.set(8,55);
arr.set(9,112);
int i;
int l=10;
Scanner sc = new Scanner(System.in);
int r = sc.nextInt();
for(i=0;i<l;i++)
if(arr.get(i)==r)
break;
System.out.println(i);
for(int k =i;k<l;k++)
arr.set(k,arr.get(k+1));
l--;
System.out.println(l);
for (int o=0;o<l;o++)
System.out.println(arr.get(o));
}
}
答案 0 :(得分:1)
第二段代码是错误的,因为在最后一次迭代(使用k==l-1
)时,它执行arr.get(k+1)
,这意味着arr.get(l-1+1)
,即arr.get(l)
,这是l
元素数组的无效索引(从0
到l-1
)。
代码不会中断,因为实际数组大于l(分配100个'slot',而实际使用的是10个)。无论如何,在所有可能的情况下,它不是一个安全的代码。所以你不应该使用它。
PS:如果实现get
方法以某种方式对无效索引具有弹性,那么代码实际上是安全的。如:
public int get(int index){
return (index < size) ? a[index] : 0;
}
答案 1 :(得分:1)
您不会在此代码中的任何位置增加或减少数组的大小。您所做的只是更改变量l,它决定了您要遍历的元素数量。因此,即使您将循环更改为for(int k =i;k<l+10;k++)
,它也会以相同的方式运行,除非您开始访问超出分配的100的元素,在这种情况下您将获得ArrayIndexOutOfBounds异常。