2010-12-15 18 views
2

次のコードでは、4つの要素が必要ですが、3つしか得られません。明らかに私は何か狂ったばかげたことをしています。変数を入れ替えたときの奇妙なjava for-eachの動作

import java.util.HashSet; 

import java.util.Set; 

public class MyTest { 
    public static void main(String[] args) { 
     String[] myStrings = new String[] { "a", "b" }; 

     Set<String> set = new HashSet<String>(); 
     for (String x : myStrings) { 
      for (String y : myStrings) { 
       String temp = x; 
       x = y; 
       y = temp; 

       set.add(x + y); 
      } 
     } 

     System.out.println(set); 
    } 
} 

結果:あなたは順序を保持しないハッシュセットに結果の文字列を入れているので、

[ba, aa, ab] 
+0

(1)bbはどこですか? (2)これは各反復のテストの単なる単純な例です。 –

+0

が間違っています!変数xとyは混乱しています。 –

答えて

4

セットは重複を許可せず、「ba」を2回追加しています。あなたのループコントロールは混乱していますが、単純化されたトレースがあり、rvaluesが展開されています。彼らはループ変数の両方にあるとき、なぜあなたはxyに物事を割り当てる

​​
+1

+1、彼は実際に彼が「ba」を2度追加しているとは思うけど。 –

+0

xとyを前後にスワップすると、誰が言うことができますか? –

+0

@Laurence、ええ、私は私の跡をしたようにそれを実現しました。 –

-1

は多分それです。リンクされたハッシュセットを試してください。

+2

注文が保存されているかどうかは、コレクションに含まれる要素の数には影響しません。 –

0
for (String x : myStrings) { 
    for (String y : myStrings) { 
     String temp = x; 
     x = y; 
     y = temp; 

     set.add(x + y); 
    } 
} 

xyを別々にループしたい場合は、xとyを入れ替えるために3行を取り除いてください。おそらくあなたが期待するものと異なる方法で変数を変更しています。

1

内側ループを実行するたびに、外側ループの変数を変更しています。そのため、xが壊れる可能性があります。

特にボディの最後から2番目の実行は、'a'からxに割り当てます。次回のループでは、"bb"を見逃してしまい、その代わりに複製リスト"ab"が出ます。

finalを使用すると便利です。

-1

問題は簡単です。出力には "bb"が入ります。 4つの文字列を生成する必要があります。

1

ループ変数で再生することが重要です。

はこれを行います。

Set<String> set = new HashSet<String>(); 
    for (String x : myStrings) { 
     for (String y : myStrings) { 
      String temp = x; 
      x = y; 
      y = temp; 
      System.out.println(x+y); 
      set.add(x + y); 
     } 
    } 

あなたがセットに上書きを意味し、二回ABを追加しているが表示されます。次に、ループ変数をループ変数以外の値を使用するように変更します。

Set<String> set = new HashSet<String>(); 
    for (String a : myStrings) { 
     for (String b : myStrings) { 
      String x = a; 
      String y = b; 
      String temp = x; 
      x = y; 
      y = temp; 
      System.out.println(x+y); 
      set.add(x + y); 
     } 
    } 

そして、あなたが望む4つのものがすべて得られます。私はあなたが作品をやったやり方で配列をどのように横切るかについていくつかの読書をしなければならないが、それは明らかに原因である。

1

外部ループ変数を変更しているので、出力に予期せず "bb"がありません。