2017-12-11 12 views
0

私の計算クラスでこの余分な信用問題のために、私の他の同級生と私は、ブルートを解くプログラムを構築することに決めました。これらのステップの1つに順列が含まれます。このアルゴリズムを通じて、私は(私は思う)、それは仕事を得るために管理:データ変更はどこですか? - Javaでの順列

public void genPermutations(int[] list, int k){ 
     System.out.println("List: " + Arrays.toString(list)); 
     System.out.println("----------------------"); 
     if(k > list.length){ 
      System.out.println("Not enough elements!"); 
      return; 
     } 

     int[] counts = new int[list.length]; 

     for(int i = 0; i < counts.length; i++){ 
      counts[i] = 1; 
     } 

     int[] data = new int[k]; 

     permutationHelper(list, counts, data, 0, k); 
    } 

    public void permutationHelper(int[] list, int[] counts, int[] data, int index, int k){ 

     if(index == k){ 
      //System.out.println(Arrays.toString(data)); 
      permutations.add(data); 
     }else{ 
      for(int i = 0; i < list.length; i++){ 
       if(counts[i] == 0){ 
        continue; 
       } 
       data[index] = list[i]; 
       counts[i]--; 
       permutationHelper(list, counts, data, index + 1, k); 
       counts[i]++; 
      } 
     } 

    } 

私はそのリストのk個の要素から作ることができる(整数配列など)の可能な順列の全てを格納ArrayListを持っています私は関数に渡します。問題は、私がgenPermutations関数を呼び出すと、関数の外でこれらの順列をすべて出力すると、すべての順列は同じになります。しかし、私がコメントのあるデータをpermutationHelper関数に表示すると、すべての可能な順列が正しくリストされます。私は後でプログラム内でそれらにアクセスすることができません。私の質問は、なぜ私は関数を終了するときに値が変更されますか?どんな助けでも大歓迎です。

What is printed where the comment is.

What is printed later in the program.

関数の外にすべてを印刷するために使用されるコードは次のとおりです:それはだ場合

for(int i = 0; i < permutations.size(); i++){ 
     System.out.println(Arrays.toString(permutations.get(i))); 
    } 

私は本当に分からない。ここ

はいくつかの写真です知っておく必要があるが、私はちょうど私がそれをちょうどために含めると思った。前もって感謝します。

+0

'data []'配列は1つだけです。あなたは順列を生成するときにそれを上書きし続けます。 –

+0

あなたのスクリーショットにはテキスト出力しか含まれていません。イメージを参照するのではなく、テキストにテキスト出力を追加する方がよいでしょう。 – MrSmith42

+0

ここで質問する前に、デバッグを試してみました。 – MrSmith42

答えて

0

問題は、あなたがlistにそれを追加した後arrayを変更している、あなたは別の反復で何度も何度も同じオブジェクトを変更しているということです。 list[3,2,1]が入っていたのは、それが最後の反復の結果だったからです。ですから、修正として次のコードを使用することができます。それは、data配列のコピーを作成し、それをリストに追加することです。

int[] temp = Arrays.copyOf(data, data.length); 
permutations.add(temp); 

OR
次のようにあなたがarrayからclone()を使用することができます。

int[] temp = data.clone(); 
permutations.add(temp); 
+0

それはうまくいった!どうもありがとうございます! – Ctsmario

1

あなたは常に同じ配列オブジェクトを変更しています。リストに異なる配列を追加する代わりに、実際には同じ配列への参照を何度も繰り返しています。

修正するには、data配列をリストに追加する代わりに、そのコピーを追加する必要があります。 Arrays.copyOf()を使用して:ここで

permutations.add(Arrays.copyOf(data, data.length)); 
+0

意味があります。私は再帰的に渡されたと考えただけで、問題なくリストに追加します。私はそれが何かを修正するとは思わなかった。どうもありがとうございます! – Ctsmario

関連する問題