2016-10-10 15 views
0

私は単語のリストを受け取るプログラムを書いています。その後、繰り返し単語と2つの異なるリストに繰り返されない単語を格納します。ダウンセットを反復する

、左、上、左、

権利である:しかし

public class Runner 
{ 
    public static void run (Set<String> words) 
    { 

     Set<String> uniques= new HashSet<String>(); 

     Set<String> dupes= new HashSet<String>(); 

     Iterator<String> w = words.iterator(); 

     while (w.hasNext()) 
     { 
      if (!(uniques.add(w.next()))) 
        { 
         dupes.add(w.next()); 
        } 
      else 
      { 
       uniques.add(w.next()); 
      } 


     } 

     System.out.println ("Uniques: "+ uniques); 
     System.out.println ("Dupes: "+ dupes); 



    } 

} 

、以下のための出力:私のコードは次のようである

ユニーク:[左、右、上、下]

Dupes:[]

、私の希望は次のようになります。

ユニーク:[左]

I:

Dupes [ダウン、アップ、左、右]セットを使ってこれを達成したい。私はそれがArrayListだけの方法が簡単だろうが、私はセットを理解しようとしています。

答えて

0
  • uniques.add(w.next())を2回実行しています。どうして?
  • また、w.next()を呼び出し続けないでください。これにより、繰り返しが実行されます。それを一度呼び出すと、ローカル参照を保持します。

用途:

String next = w.next(); 
if(uniques.contains(next)) { 
    // it's a dupe 
} else { 
    // it's not a dupe 
} 
3

問題の理由は、引数の言葉がSet<String>であるということです。定義によるセットには重複は含まれません。引数ワードはList<String>である必要があります。このコードでは、w.next()を2度間違えています。 next()を呼び出すと、イテレータが前進します。 「アップ」

public static void run(List<String> words) { 
    Set<String> uniques= new HashSet<String>(); 
    Set<String> dupes= new HashSet<String>(); 
    Iterator<String> w = words.iterator(); 
    while(w.hasNext()) { 
     String word = w.next(); 
     if(!uniques.add(word)) { 
      dupes.add(word); 
     } 
    } 
} 
+0

Dupesが、私は 'リストリストを使用してコードをテストしている – ZeldaX

+0

@DragonAssassin所望の出力を返さない=は、Arrays.asListが(「右」、「左」、「左」は、「ダウン」 );実行(リスト); '。あなたの望む出力を表示します。あなたはrunメソッドを呼び出すために使用しているコードを提供できますか? – DragonAssassin

関連する問題