2016-11-23 5 views
0

元の配列を関数のパラメータとして提供した後に配列を更新しようとしています。私はこれを達成する方法がわかりません。私はまだすべての材料をカバーしていないと私はあなたの助けが必要です。だから私は、達成しようとしています何:結果の配列で配列を更新して関数を呼び出すことから

オリジナル配列:[1、2、3、4、5、6]
のn = nは、配列の回数が要素である3ます右
シフトアレイにシフトさせること:[4、5、6、1、2、3]

Iは、1つの位置だけシフトメソッドを作成しました。私はNポジションで切り替えるもう一つの方法を持っています。ここで私はメソッドを1ポジション切り替えます。配列を一度切り替えますが、元の配列をシフトの結果で更新することはできません。だからではなく、取得する:

Original array: [1, 2, 3, 4, 5, 6] 
RIGHT SHIFT: [6, 1, 2, 3, 4, 5] 
RIGHT SHIFT: [5, 6, 1, 2, 3, 4] 
RIGHT SHIFT: [4, 5, 6, 1, 2, 3] --> **final result** <br> 

私が取得:

Original array: [1, 2, 3, 4, 5, 6] 
RIGHT SHIFT:  [6, 1, 2, 3, 4, 5] 
RIGHT SHIFT:  [6, 1, 2, 3, 4, 5] 
RIGHT SHIFT:  [6, 1, 2, 3, 4, 5] 

は私のコード:

public class Shift { 

public static int[] rotate(int[] seq){ 
    int[] origArr = seq; 
    int[] shiftedArrR = new int[seq.length]; 

    for (int i = 0, j = i+1; j < origArr.length; i++, j++) { 
     shiftedArrR[j] = origArr[i]; 
    } 
    shiftedArrR[0] = origArr[origArr.length-1]; 

    System.out.print("RIGHT SHIFT: "); 
    System.out.println(java.util.Arrays.toString(shiftedArrR)); 
    return shiftedArrR; 
} 

public static void rotate(int[] seq, int times){ 

    System.out.println(java.util.Arrays.toString(seq)); 
    int[] temp = new int[seq.length]; 

    for (int i = 1; i <= times; i++) { 
     temp = rotate(seq); 
    } 
} 


// ------------ MAIN METHOD ---------------- 
public static void main(String[] args) { 

    System.out.print("Original array: "); 
    rotate(new int[]{1,2,3,4,5,6}, 3); 
    } 

} 

どうやら回転(配列)の結果は、ある配列に割り当てられていませんrotate()メソッドに提供されています。 私はそれが何か非常に簡単であることを知っていて、これを修正するさまざまな方法を試しましたが、運がありません。

答えて

1
public static void rotate(int[] seq, int times){ 

    System.out.println(java.util.Arrays.toString(seq)); 
    for (int i = 1; i <= times; i++) { 
     seq = rotate(seq); 
    } 
} 

このコードでrotateメソッドを置き換えます。 rotate(seq)を使用して同じ配列を常に回転させます。 tempに保存するので、tempの代わりにseqを使ってメソッドを呼び出すという問題があります。したがって、forループの内容をseq = rotate(seq);に変更してください。これにより、2番目のrotateメソッドの出力がメソッドに再度渡された配列に保存されます

+0

ありがとう!私はそれが本当にシンプルなものだと分かっていましたが、私はそれについて盲目でした。 :) –

2

ここでは、変更された配列(temp)ではなく3つの繰り返しのそれぞれで未変化の配列(seq)を使用しています

for (int i = 1; i <= times; i++) { temp = rotate(seq); }

+0

ありがとう!私は実際に配列を更新していないことを知っていましたが、何度も繰り返し使用していましたが、私の(明らかに愚かな)間違いがどこにあったのか分かりませんでした:) –

2

あなたはrotate(int[] seq)メソッドに正しい回数が、あなたは無修正「配列」配列ではなく、以前の回転の出力に渡すたびに呼び出しています。

int[] temp = new int[seq.length];でテンポラリ配列を作成すると、作成した新しい配列で実際に何もすることはありません。読み込まれることはなく、rotateメソッドから返された別の新しい配列(shiftedArrR)に置き換えられます。

これを回避する方法の1つは、tempアレイを捨て、ループ内の行をseq = rotate(seq);に置き換えることです。

もう1つの方法は、新しい配列を返すのではなく、渡した配列の内容を実際に上書きするように、元のrotateメソッドを変更することです。

+0

実際に元のアイデアは、 VOIDメソッドで、int []に変更して配列を返しました。これは解決策かもしれないと考えましたが、まだ動作しませんでした。 最初のものがVOIDだった場合、どのように見えるでしょうか? –

1

主に、変更された配列の代わりに、各反復で未変更の配列を使用しています。

また、rotate(int [] seq)関数はかなり混乱しているようです。だから私はちょっと更新する。[最も簡単な方法で]。また、配列を格納するために余分な一時変数を作成する必要もありません。

public class RightShift { 

    public static void rotate(int[] seq){ 

     int temp = seq[seq.length - 1]; 

     for(int i = seq.length -1 ; i>0; --i) 
      seq[i] = seq[i-1]; 

     seq[0] = temp; 

     System.out.println("RIGHT SHIFT: "); 
     System.out.println(java.util.Arrays.toString(seq)); 
    } 

    public static void rotate(int[] seq, int times){ 

     System.out.println(java.util.Arrays.toString(seq)); 

     for (int i = 1; i <= times; i++) { 
      rotate(seq); 
     } 
    } 


    // ------------ MAIN METHOD ---------------- 
    public static void main(String[] args) { 

     System.out.print("Original array: "); 
    // rotate(new int[]{1,2,3,4,5,6}); 
     rotate(new int[]{1,2,3,4,5,6}, 3); 
     } 
} 
+0

ありがとう!私はこのバージョンをチェックします、それを簡素化してくれてありがとう。通常、何かをプログラムする方法(数学と同じ)を理解しなければならないときは、最後に非常に複雑なことが起こります。たとえば、コードの1行だけです。何らかの形で「考え方」を更新する必要があります。 –

0

言及されたほとんどの人と同様に、アレイは突然変異しなかった。とにかく、より簡単なアプローチは、1つの回転方法を書くことです。

import java.util.Arrays; 

public class Shift { 
    public static int[] rotate(int[] seq, int times){ 
     int temp = 0; 
     int round = 0; 
     while (round <times) { 
      for(int i=0;i<seq.length;i++) { 
       if(i == seq.length-1) { 
        seq[seq.length-1] = temp; 
        break; 
       } 
       if(i == 0) 
        temp = seq[i]; 
       seq[i]=seq[i+1]; 
      } 
      round++; 
     } 
     System.out.println("Rotated array: " +Arrays.toString(seq)); 
     return seq; 
    } 

    // ------------ MAIN METHOD ---------------- 
    public static void main(String[] args) { 
     int[] original = new int[]{1,2,3,4,5,6}; 
     System.out.println("Original array: " + Arrays.toString(original)); 
     rotate(new int[]{1,2,3,4,5,6}, 3); 
     } 
} 
+0

それは素晴らしいです!私はメソッドを持つことができるかどうか疑問に思っていましたが、最初の更新後のパラメータの1つ、つまりシフトの数だけを提供します。しかし、1つの方法でこれを達成する方法と、それがまったく可能なのかどうかは分かりませんでした。私はあなたが過負荷でこれを行うことができることを知っているだけです。 –

関連する問題