删除数组中中间元素的previous和next元素,并使用Java shrik the array

时间:2015-05-16 11:28:29

标签: java arrays arraylist

我有一个数组说n个元素 我把数组放到数组列表中。然后我找到中间索引并删除中间元素的上一个和下一个元素..

例如,如果我的数组有6个数字 {1,2,3,4,5,6} 我发现中间元素即4并删除3和5.现在我的数组应缩小并运行循环,直到数组变空。我该怎么做呢?

这是我的代码

    Scanner in=new Scanner(System.in);
            int t=in.nextInt();
            System.out.println("t value"+t);
            int n=in.nextInt();
            System.out.println("n value"+n);

                int arr[] = new int[n];
            for(int i=0;i<n;i++){
                arr[i] =  in.nextInt();
                    System.out.println("a[j]"+arr[i]);
                }
                ArrayList<Integer> obj = new ArrayList<Integer>();
                int count=0;
            for(int k=0;k<n;k++){
                obj.add(k,arr[k]);
            }
                //int m = in.nextInt();
                //System.out.println("m value"+m);
    for(z=0;z<n;z++){
          int middleIndex = (arr== null || arr.length == 0) ? 
        -1 : arr.length / 2; 
        System.out.println("middle"+middleIndex);
        obj.remove(middleIndex-1);
        obj.remove(middleIndex+1);
        --n;
    System.out.println(arr[z]);
        }
  }
}

我收到以下错误:

t value1
n value6
a[j]1
a[j]2
a[j]3
a[j]4
a[j]5
a[j]6
middle3
[1, 2, 4, 5]
middle3
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 4, Size: 3
    at java.util.ArrayList.rangeCheck(ArrayList.java:604)
    at java.util.ArrayList.remove(ArrayList.java:445)
    at TestClass.main(**.java:46)

此外它还删除了我的middleIndex-1和middleIndex + 2元素。我想只删除要删除的数组的上一个和下一个元素。

2 个答案:

答案 0 :(得分:1)

您的问题是,您要从ArrayList变量obj中删除元素,而您正在根据int数组变量arr计算中间值,其长度不会改变删除元素后。因此,在第二个循环的示例中,middleIndex为3,但obj的大小为4.现在,如果调用obj.remove(middleIndex+1);,则意味着obj.remove(4)抛出IndexOutOfBoundException }}

您的删除循环也存在问题。您使用了一个新变量z,它从0开始并继续n,如您的示例所示,此处为6。但问题是在第一个循环之后obj的长度为4,在第二个循环之后obj大小为2,在第三个循环之后,大小变为0.所以循环的效用是多少之后?如果

,那会不会更好

您可以通过以下方式进行更改来解决此问题:

while(obj.size()>0){
      int middleIndex = (obj.size() == 0) ? 
    -1 : obj.size() / 2; // replace the arr variable with obj. 
    System.out.println("middle"+middleIndex);
    obj.remove(middleIndex-1);
    obj.remove(middleIndex+1);
    --n;
    System.out.println(arr[z]);
}

答案 1 :(得分:0)

您使用的是错误对象的大小,您需要使用obj而不是arr,并在尝试删除它们之前确保元素存在。 这样的事情可以解决这些问题:

 for(int z=0;z<n;z++){
     int middleIndex = (obj== null || obj.size() == 0) ?
          -1 : obj.size() / 2;
     System.out.println("middle"+middleIndex);
     if (middleIndex-1>0)
          obj.remove(middleIndex-1);
     if (middleIndex+1<obj.size())
          obj.remove(middleIndex+1);
     --n;
     System.out.println(arr[z]);
 }