0

我正在处理一个 java 分配,我需要删除数组中的一个整数元素并将下面的元素向上移动以保持它们的顺序。该数组目前是降序的随机整数。我不允许使用 array.copy,因为我需要收集数组使用信息作为分配的一部分。我已经尝试了很多不同的方法来做到这一点,但似乎无法让它发挥作用。

public static void deletionArray(int anArray[], int positionToDelete) {
    for (int j = anArray[positionToDelete] - 1; j < anArray.length; j++) {
        System.out.println("j is " + j);
        anArray[j] = anArray[j + 1];
    }

    displayArray(anArray);
}   
4

5 回答 5

2

您正在迭代直到anArray.length(独占),但在循环内部,您正在访问anArray[j + 1],因此这将等于anArray[anArray.length]最后一次迭代,这将导致 ArrayIndexOutOfBoundsException。

迭代直到anArray.length - 1(不包含),并决定应该在数组的最后一个元素中存储什么而不是之前的值。

您也是从 开始anArray[positionToDelete] - 1,而不是从 开始positionToDelete

于 2013-02-02T21:21:42.120 回答
1

你有两个错误。

由于这是一项作业,我不会给出完整的答案 - 只是一个提示。你的循环定义是错误的。想一想:循环的第一次和最后一次迭代会发生什么?想象一个 5 元素数组(编号为 0 到 4,根据 Java 规则),并在擦除元素编号(例如 2)时计算出循环迭代中的变量值。

于 2013-02-02T21:20:55.870 回答
0

使用System.arraycopy比循环更快:

public static void deletionArray( int anArray[], int positionToDelete) {
    System.arraycopy(anArray, positionToDelete + 1, anArray,
            positionToDelete, anArray.length - positionToDelete - 1);
    //anArray[length-1]=0;        //you may clear the last element 
}
于 2013-02-02T21:22:02.010 回答
0
public static int[] deletionArray(int anArray[], int positionToDelete) {
    if (anArray.length == 0) {
        throw new IlligalArgumentException("Error");
    }
    int[] ret = new int[anArray.length - 1];
    int j = 0;
    for (int i = 0; i < anArray.length; ++i) {
        if (i != positionToDelete) {
            ret[j] = anArray[i];
            ++j;
        }
    }
    return ret;
}

为什么我们要保留一个新数组?

因为如果不这样做,我们将使用 C\C++ 样式的数组:一个数组和它的“使用长度”。

public static int deletionArray(int anArray[], int positionToDelete, int n) {
   if (n == 0) {
       throw new IlligalArgumentException("Error");
   }
   for (int i = positionToDelete; i < n - 1; ++i) {
       anArray[i] = anArray[i + 1];
   }
   return n - 1; // the new length
}
于 2013-02-02T21:23:54.347 回答
0

这个怎么样 ?请注意评论,我认为您不能删除数组中的元素,只需将其替换为其他内容,这可能很有用:Removing an element from an Array (Java)

更新了“JB Nizet”评论:

public class Driver {

    public static void main (String args []){

        int intArray[] = { 1,3,5,6,7,8};
        int updatedArray[] = deletionArray(intArray , 3);

         for (int j = 0; j < updatedArray.length; j++) {    
             System.out.println(updatedArray[j]);
         }

    }

    public static int[] deletionArray(int anArray[], int positionToDelete) {
        boolean isTrue = false;


           for (int j = positionToDelete; j < anArray.length - 1; j++) {            
                if(j == positionToDelete || isTrue){
                    isTrue = true;
                    anArray[j] = anArray[j + 1];
                }

            }

        anArray[anArray.length-1] = 0; //decide what value this should be or create a new array with just the array elements of length -> anArray.length-2
        return anArray;
    }
}
于 2013-02-02T21:25:35.167 回答