2017-09-28 14 views
-2

状況は、最大5000個の要素を持つセットを反復処理する必要があるということです。現在、私はイテレータで通常のforループを使用しています。JavaのSetを反復処理する最良の方法

for (Iterator iterator = allValues.iterator(); iterator.hasNext();) { 

    ListMetadataElem element = (ListMetadataElem) iterator.next(); 
    NameValueObject value = new NameValueObject(); 
    value.setId(element.getListMetadataElemSeqId().toString());  
    value.setValue(element.getListMetadataElemNm()); 
    abstractVO.getAllListMetadataElems().add(value);  
} 

問題は、6-7秒のように反復するには時間がかかり過ぎるため、同じループを複数回呼び出す必要があります。ここ

+0

** Java 8パラレルストリームへのチャンスを与える** –

+0

時間を費やしているのは確かですか? 5000要素は無駄になりません。 –

+0

私はJavaをあまり使いませんが、Pythonでは、単純な '5000'要素のセットに対する反復は非常に速く、わずか6〜7秒です。私はそれがJavaの中では速くて、おそらくもっと高速かもしれないと仮定することができます。私はあなたのループ*内で何が起こっているのだろうと思うので、 'abstractVO.getAllListMetadataElems()'はどういうことでしょうか? –

答えて

2

は比較されている:

public class IterateSet { 

    public static void main(String[] args) { 

     //example Set 
     Set<String> set = new HashSet<>(); 

     set.add("Jack"); 
     set.add("John"); 
     set.add("Joe"); 
     set.add("Josh"); 

     long startTime = System.nanoTime(); 
     long endTime = System.nanoTime(); 

     //using iterator 
     System.out.println("Using Iterator"); 
     startTime = System.nanoTime(); 
     Iterator<String> setIterator = set.iterator(); 
     while(setIterator.hasNext()){ 
      System.out.println(setIterator.next()); 
     } 
     endTime = System.nanoTime(); 
     long durationIterator = (endTime - startTime); 


     //using lambda 
     System.out.println("Using Lambda"); 
     startTime = System.nanoTime(); 
     set.forEach((s) -> System.out.println(s)); 
     endTime = System.nanoTime(); 
     long durationLambda = (endTime - startTime); 


     //using Stream API 
     System.out.println("Using Stream API"); 
     startTime = System.nanoTime(); 
     set.stream().forEach((s) -> System.out.println(s)); 
     endTime = System.nanoTime(); 
     long durationStreamAPI = (endTime - startTime); 


     //using Split Iterator (not recommended) 
     System.out.println("Using Split Iterator"); 
     startTime = System.nanoTime(); 
     Spliterator<String> splitIterator = set.spliterator(); 
     splitIterator.forEachRemaining((s) -> System.out.println(s)); 
     endTime = System.nanoTime(); 
     long durationSplitIterator = (endTime - startTime); 


     //time calculations 
     System.out.println("Iterator Duration:" + durationIterator); 
     System.out.println("Lamda Duration:" + durationLambda); 
     System.out.println("Stream API:" + durationStreamAPI); 
     System.out.println("Split Iterator:"+ durationSplitIterator); 
    } 
} 

コードは自明です。 期間の結果は以下のとおりです。

Iterator Duration:495287 
Lamda Duration:50207470 
Stream API:2427392 
Split Iterator:567294 

私たちは、イテレータが最速である一方、ラムダが最長になります見ることができます。 これとは別に、伝統的な古くなったforループがあります。

+1

イテレータの場合は約0.5秒、Lambaの場合は50秒です。かなりリグレスではありません –

+0

これらの値は実際にベンチマークされていますか? – nullpointer

+0

@nullpointerコードを実行して正確な結果をコピーしました。 –

-1

javaまたはそれ以上のバージョンを使用している場合は、enhanced forループまたはそれぞれを使用できます。私はそれぞれがイテレータに比べて良いと思われると思います。

関連する問題