2016-05-08 2 views
0

私はsetから要素を取り出そうとしていますが、それはclunky命題を減らし、検索後に要素を削除するのに役立ちますので、pollFirst()を使用することをお勧めします。セット全体を反復するために、私は一般的な "for"アプローチを使用しました。このアプローチでは、セットの一部だけを取り出すことができました。私はいくつかの検索を行い、while文の使用を提案する解決策を見つけることができました。しかし、なぜそれが起こったのですか? 問題文を簡単にするために、私は微妙なコメントを提供しました。なぜforFirst/Last()はfor文を使って繰り返しながらNavigableSetのすべての要素を取得できないのですか?

class SetTest { 
    public static void main(String[] args) { 
     TreeSet<String> ts = new TreeSet<String>(); 
     ts.add(new String(new String("one"))); 
     ts.add("two"); 
     ts.add(new String("three")); 
     NavigableSet<String> ns = new TreeSet<String>(); 
     ns.addAll(ts); 
     System.out.println("Before while " + ns.size());// gives us 3 
     while (ns.size() != 0) 
      ns.pollFirst(); 
     System.out.println("After while " + ns.size());// gives us 0. 
     System.out.println("Before for " + ts.size());// gives us 3 
     for (int i = 0; i < ts.size(); i++) 
      ts.pollFirst(); 
     System.out.println("After for " + ts.size());// gives us 1. WHY?? 
    } 
} 

答えて

1

ループの中ts変化の大きさは、例えばサイズが10に等しい場合はおそらくので、ループは、おそらくこのようになります:

EDIT
i = 0; size = 10 
i = 1; size = 9 
i = 2; size = 8 
i = 3; size = 7 
i = 4; size = 6 
i = 5; size = 5 -> breaks the for loop. 

: がいることを言及するのを忘れました条件を

for(int i = 0; ts.size() != 0; i++) 

に変更するか、外部変数にサイズを保持してforループでそれを使用することで修正できます。

関連する問題