两个数组删除代码的区别

时间:2014-09-07 16:14:44

标签: java arrays

我有两个代码用于删除数组中的元素,但这两个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));


            }
    }

2 个答案:

答案 0 :(得分:1)

第二段代码是错误的,因为在最后一次迭代(使用k==l-1)时,它执行arr.get(k+1),这意味着arr.get(l-1+1),即arr.get(l),这是l元素数组的无效索引(从0l-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异常。