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

You're iterating until anArray.length (exclusive), but inside the loop, you're accessing anArray[j + 1], which will thus be equal to anArray[anArray.length] at the last iteration, which will cause an ArrayIndexOutOfBoundsException.

Iterate until anArray.length - 1 (exclusive), and decide what should be stored in the last element of the array instead of its previous value.

You're also starting at anArray[positionToDelete] - 1, instead of starting at positionToDelete.

于 2013-02-02T21:21:42.120 に答える
1

そこに 2 つのバグがあります。

これは課題なので、完全な回答はしませんが、ヒントだけです。ループ定義が間違っています。考えてみてください: ループの最初と最後の反復で何が起こるでしょうか? 5 要素の配列 (Java の規則に従って 0 から 4 までの番号が付けられている) を想像して、要素番号 (たとえば 2) を消去しているときに、ループの繰り返しで変数の値を計算します。

于 2013-02-02T21:20:55.870 に答える
0

これはどうですか?コメントに注意してください。配列内の要素を削除することはできないと思います。単にそれを別のものに置き換えるだけです。これは役立つかもしれません:配列から要素を削除する (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 に答える
0

Use System.arraycopy faster than a loop:

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 に答える