2017-04-18 5 views
-2

intの配列をチャンクでシャッフルしようとしていますが、これまでのところほとんど成功していません。intのチャンクをintのシャフリング

私は0から17

array = new int[18]; 
for(int i = 0; i < 18; i++){ 
    array[i] = i; 
} 

そして、私はintの配列は、0のように起動し

int[] chunks = {2, 3, 10, 3}; 

をシャッフルしたいintの各チャンクの配列に18個のintの配列を持っています1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 2のチャンク配列の最初の要素が選択されると、最初の2つの要素配列の要素である0と1が選択されます。 1が配列の最後に移動し、0が続きます。

今順序は第二のために2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,0,1

です要素の値が3であるため2,3,4が選択され、0と1の上に置かれます。

今度は5,6,7,8,9、 intの配列が完全にチャンクの全て

アレイでシャッフルされるまでこれが継続10,11,12,13,14,15,16,17,2,3,4,0,1

チャンクで完全にシャッフルされているのは15,16,17,5,6,7,8,9,10,11,1です2,13,14,2,3,4,0,1

研究

は、私はこれをプログラミングしようとしたこれまでに

for(int i = 0; i < chunks[0] i++) { 
    int first = array[0]; 
    System.arraycopy(array, 1, array, 0, array.length-1); 
    array[array.length - 1] = first; 
} 

とされている方法を更新

これは、私が今作業しているコードは、次の結果を得ています。 10,11,12,13,14,15,3,4,5,6,7,8,9,1,1,1,1,1 、代わりに 15,16,17,5,6,7,8,9,10,11,12,13,2,4,2,3,4,0,1

012の代わりに
int[] array2 = array.clone(); 
    int temp = array2[0]; 
    int chunkIndex = 0; 
    int count = 0; 
    int chunkCount = 0; 

    //Loops 4 times 
    for(int i = 0; i < chunks.length; i++) { 
     //Loops as many times for the chunk element 
     while(chunks[i] > count) { 
      for(int k = 1; k < array2.length; k++) { 
       //Move all the elements back 
       array2[k-1] = array2[k]; 
      } 

      chunkIndex = array2.length-1 - chunkCount; 
      array2[chunkIndex] = temp; 

      temp = array2[0]; 

      count++; 
     } 

     //Increment the limit 
     chunkCount += chunks[i]; 
     //System.out.println(chunkCount); 

     } 

ご迷惑をおかけして申し訳ございません。

ありがとうございます。

+0

これまでに試したことがあるコードを教えていただければ役に立ちますか? –

+0

'for'ループの文法エラーでさえ、これは' int'に '配列 'を割り当てる最後の行のためにコンパイルされません('配列[...] 'は' int' ) –

+0

はい、あなたは正しい、それは私の部分のミスタイプだった。私は配列ではなく最初に置くことを意味します。 – user221

答えて

0

これは良い演習であるため、コードは提供しません。

しかし、まずアレイをもう一度コピーしないでください。これは、アレイ内の値をシフトするための簡単な方法である

1 - Read the chunk length 
2 - Save the first value in a temp variable 
3 - Shift every value on the left 
4 - Put the temp variable at the end 

塩基性溶液になるであろう。

ここで、すべてのチャンクについて、最後の値の前に値を置く必要があるので、このチャンクのindexがどこにあるかを覚えておく必要があります。これはちょうどlastIndex - chunk lengthです。これはシフトの限界と一時的な値をどこに置くかです。

これにより、最適な状態で動作するソリューションを簡単に作成できます。クーゼの

チャンクが多数の値を読めばあなたは12個のセルのアレイで13項目をしたい場合は、いくつかの問題が(あり

EDIT:

1 - あなたはtemp前を保存する必要がありますが。

2 - あなたは常に配列全体を移動しているので、移動した後に最初のチャンクを移動することになります。 indexはデクリメントされます

int endIndex = array2.length; //### 2 ### 
while(chunks[i] > count) { 
    temp = array2[0]; //### 1 ### 

    for(int k = 1; k < endIndex; k++) { //### 2 ### 
     //Move all the elements back 
     array2[k-1] = array2[k]; 
    } 

    ... 
} 
endIndex -= chunks[i]; 

これは少し良くなるはずですが、私はこの不幸をテストする時間がありません。

+0

私はあなたにこの問題を解決する方法のより良い理解を持っています。私はほぼ完成しましたが、最終的に配列の要素をオーバーライドしています。 – user221

+0

@Aaron、この数少ない更新を確認してください。あなたは私の解決策から遠く離れていないと思います。しかし、これにはまだいくつかの改良が必要です。 – AxelH

+0

更新が本当に助けになりました。私のプログラムは、int型を使って期待通りにシャッフルしています。私がそれを解決するのに役立ちますありがとう! – user221

関連する問題