在java中如何将数组元素上移一个位置?

在java中如何将数组元素上移一个位置?,java,arrays,Java,Arrays,我正在处理一个java赋值,我需要删除数组中的一个整数元素,并将下面的元素在空间上上移,以保持它们的顺序。数组当前是按降序排列的随机整数。我不允许使用array.copy,因为我需要收集阵列使用信息作为分配的一部分。我已经尝试了很多不同的方法,但似乎无法让它工作 public static void deletionArray(int anArray[], int positionToDelete) { for (int j = anArray[positionToDelete] - 1

我正在处理一个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);
}   
公共静态void deletionArray(int-anArray[],int-positionToDelete){
对于(int j=anArray[positionToDelete]-1;j
您有两个bug


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

这里有两个bug


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

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

迭代直到
anArray.length-1
(独占),并决定应在数组的最后一个元素中存储哪些内容,而不是其以前的值


您也从
anArray[positionToDelete]-1开始,而不是从
positionToDelete
开始迭代,直到
anArray.length
(独占),但在循环内部,您访问的是
anArray[j+1]
,因此在最后一次迭代时,它将等于
anArray[anArray.length]
,这将导致ArrayIndexOutOfBoundsException

迭代直到
anArray.length-1
(独占),并决定应在数组的最后一个元素中存储哪些内容,而不是其以前的值


您也可以从数组[positionToDelete]-1开始,而不是从
positionToDelete开始使用
System。数组复制比循环快:

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 
}

使用
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 
}
公共静态int[]删除数组(int-anArray[],int-positionToDelete){
如果(anArray.length==0){
抛出新的IlligalArgumentException(“错误”);
}
int[]ret=new int[anArray.length-1];
int j=0;
对于(int i=0;i
我们为什么要保留新阵列?

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

公共静态int-deletionArray(int-anArray[],int-positionToDelete,int-n){
如果(n==0){
抛出新的IlligalArgumentException(“错误”);
}
对于(int i=位置删除;i
公共静态int[]删除数组(int-anArray[],int-positionToDelete){
如果(anArray.length==0){
抛出新的IlligalArgumentException(“错误”);
}
int[]ret=new int[anArray.length-1];
int j=0;
对于(int i=0;i
我们为什么要保留新阵列?

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

公共静态int-deletionArray(int-anArray[],int-positionToDelete,int-n){
如果(n==0){
抛出新的IlligalArgumentException(“错误”);
}
对于(int i=位置删除;i
这是怎么回事?请注意注释,我不认为您可以删除数组中的元素,只需将其替换为其他元素,这可能很有用:

更新为“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;
    }
}
公共类驱动程序{
公共静态void main(字符串参数[]){
int intArray[]={1,3,5,6,7,8};
int updateArray[]=deletionArray(intArray,3);
对于(int j=0;janArray.length-2的数组元素创建一个新数组
返回混乱;
}
}

这是怎么回事?请注意注释,我不认为您可以删除数组中的元素,只需将其替换为其他元素,这可能很有用:

更新为“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;
    }
}
公共类驱动程序{
公共静态void main(字符串参数[]){
int intArray[]={1,3,5,6,7,8};
int updateArray[]=deletionArray(intArray,3);
对于(int j=0;j