5

これは私がこれまでに持っているものですが、実行すると、Javaの不一致エラーが発生します。これは私の配列です:

char[] letters = {'A', 'B' , 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};


/********************************************************************************
    shiftRight() will move the contents of the array one slot to the right
********************************************************************************/
public static void shiftRight( char [] letters )
{
    char last = letters[letters.length-1];          // save off first element

    // shift right
    for( int index =letters.length-1; index >= 0 ; index-- )
        letters[index+1] = letters [index];

    // wrap last element into first slot
    letters[0] = last;
    System.out.print("\nshifted Array: " );
}
4

6 に答える 6

12

あなたは次のようなことをすることができます:

 public static void shiftRight( char [] letters )
    {

        char last = letters[letters.length-1];          // save off first element

        // shift right
        for( int index =letters.length-2; index >= 0 ; index-- )
            letters[index+1] = letters [index];

        // wrap last element into first slot
        letters[0] = last;
        System.out.print("\nshifted Array: " + Arrays.toString(letters) );

    }

私はあなたの:letters.length-1を変更letters.length-2して配列に出力しただけです。

もう1つの簡単なアプローチは、次のSystem.arraycopyように使用することです。

last = letters[letters.length-1];
System.arraycopy(letters, 0, letters, 1, letters.length-1 );
letters[0] = last;

配列を印刷するには、次を使用することもできます。

System.out.print("{");
for (int i=0;i<letters.length-1;i++)
    System.out.print("'"+letters[i]+",");
System.out.println("'"+letters[letters.length-1]+"'}");
于 2012-10-29T20:27:32.400 に答える
1

letters[index+1]がforループで初めて実行されるとき(when)は、インデックスがからに移動するため、有効なインデックスではないindex = letters.length-1ことを指します。letters[letters.length]0length-1

forループを更新して開始indexletters.length-2、を確認しますarray.length>1。つまり、次のようになります。

   if(letters.length > 1){ //make sure array has minimum two elements
      // shift right
      for( int index = letters.length-2; index >= 0 ; index-- ){
          letters[index+1] = letters [index];
      }
   }

また、最後に、配列を次のように出力することもできます。

   System.out.println("Shifted Array: " +letters); 

編集:サンプル作業コード。

Character配列を以下の配列として作成する場合main(これは印刷の支援にのみ必要です)

    Character[] letters = {'A', 'B' , 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};

次に、以下のように更新されたコードを使用してメソッドに渡しshiftRightます。

  public static void shiftRight( Character [] letters )
  {
    Character last = letters[letters.length-1];  
    if(letters.length >1){ //make sure array has minimum two elements
        // shift right
        for( int index =letters.length-2; index >= 0 ; index-- ){
            letters[index+1] = letters [index];
        }
     }
    letters[0] = last;
    System.out.println(Arrays.toString(letters));
    //^ prints: Shifted Array: [J, A, B, C, D, E, F, G, H, I]
  }

あなたはすべて設定されている必要があります。

于 2012-10-29T20:24:57.740 に答える
0

追加

     if(index<letters.length-1)  condition 

前のforループ内

 letters[index+1] = letters [index]

条件をチェックしないif(index<letters.length-1)と、最後のインデックスでArrayIndexOutOfBounds例外が発生します。letters[index+1] = letters [index]

于 2012-10-29T20:24:52.183 に答える
0

確かに、ArrayIndexOutOfBoundsException(ループ内で)読みたいと思ったらすぐに取得します:

letters[index+1]

原因はindex変数の初期化です。index = letters.length-1

したがってletters[index+1] == letters[letters.length] 、論理的letters.lengthにはにつながり ArrayIndexOutOfBoundsExceptionます。

ロジックを変更せずにコードを修正する簡単な方法:

for(int index = letters.length-1; index > 0 ; index--)
   letters[index] = letters [index-1];

>の代わりに演算子記号に注意してください>=。そうでなければ、これも同じになりExceptionます。

さらに、最終的な配列を表示するには、次を使用します。Arrays.toString(letters)

私はあなたの論理を維持しながら私の解決策を書きました:

public static void main(String[] args) {
    char[] letters = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
    printShiftedLetters(shiftElementsToRight(letters));
}

public static char[] shiftElementsToRight(char[] array) {
    if (array == null) {
        throw new NullPointerException("array must not be null");
    }
    if(array.length <= 1){
        return array;
    }
    char[] shiftedArray = new char[array.length];
    char lastElement = array[array.length - 1];
    for (int i = array.length - 1; i > 0; i--) {
        shiftedArray[i] = array[i - 1];
    }
    shiftedArray[0] = lastElement;
    return shiftedArray;
}

private static void printShiftedLetters(char[] shiftedLetters) {
    System.out.println(Arrays.toString(shiftedLetters));
}
于 2012-10-29T20:50:44.377 に答える
0

整数値の場合

整数値に対して次のようなことができます。

public static void main(String[] args) {
    int arr[] = {1,2,3,4,5};
    arrayReorder(arr,25);
}



private static void arrayReorder(int[] arr, int repeat) {
    int count = 0;
    int length = arr.length;
    int end = 0;
    int traversedArray[] = new int[length];

    while (count < repeat) {
        end = arr[length-1];
        for (int i = 1; i < length; i++) {
            traversedArray[i] = arr[i-1];
            traversedArray[0] = end;
        }
        System.out.println();
        for (int a : traversedArray) {
            System.out.print(a + " -> ");
        }
        arr = traversedArray.clone();
        count++;
    }
}
于 2020-01-08T09:05:29.297 に答える
0

次の解決策は私のために働いた。

   public void rightShiftArray(int[] arr, int n){
        int[] output=new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            int newLocation = (i+(arr.length+n))%arr.length;
            output[newLocation] = arr[i];
        }
        for (int i = 0; i < output.length; i++) {
            System.out.print(output[i]+",");
        }
    }

arr->シフトする配列n->要素をいくつの位置だけシフトします。

于 2021-09-05T14:44:38.827 に答える