2017-08-08 2 views
-3

私はほぼ600のエントリを持つカスタム配列リストを持っています。Javaの最速の方法で収集した条件に基づいてデータをフィルタリングする

いくつかの条件に基づいて値をフィルタリングする必要があります。私は基本的なループのものを試していますが、その処理に時間がかかっています。私が望むのは、データをフィルタリングする最速の方法です。

public class MyModel { 
    private boolean attempeted = false; 
    private String answer; 

    public MyModel(String answer) { 
    this.answer = answer; 
    } 

    public void setAttempted(boolean attempeted) { 
    this.attempeted = attempeted; 
    } 

    public String getAnswer() { 
    return answer; 
    } 

    public boolean isAttempeted() { 
    return attempeted; 
    } 

} 

は、上記の私が真 しようとした値を持つデータのみを取得する必要がある何をしたい私のモデルです。これは私が持っているものです:

ArrayList<TestAnswerModel>myMainArrayList=array which contain all my data 
ArrayList<TestAnswerModel>filterArrayList=new ArrayList<>(); 
for(int i=0;i<myMainArrayList.size();i++) 
    { 
     if(myMainArrayList.get(i).isAttempeted()) { 
      filterArrayList.add(myMainArrayList.get(i)) 
     } 
    } 

上記はうまくいきますが、私のデータが大きすぎると時間がかかります。また、データは600になり、試行された値は2または3の値に対してのみ真となるため、このループは何の結果も起こりません。

データをフィルタリングする最も速い方法を教えてください。

+0

他のコードに問題があると思われます。 600件のエントリーでは本当にすばらしいものになるはずです。あなたは時間ログを入れてループをとっている時間を測定できますか? (*このループだけを取る時間を測定する、あなたのデータフェッチロジックを含まない*) –

+0

は私の上記のmethordですが、最も速い方法ですか? –

+1

これはかなり主観的な質問ですが、私の最初の質問に答えることができますか? –

答えて

3

特定の条件を満たすリスト内のすべてのエントリを収集したいとします。シーケンシャルループは、基本的に最も速いの方法です。あなたのリストの要素の5%または95%が結果リストに表示されることを期待するなら、違いはありません。すべてのエントリを参照して結果リストを計算する必要があります。もちろん

、あなたはstreamsとフィルタリングになるかもしれない - それはあなたが並行して、リストのparallelStream()とプロセスセクションを使用することができるようになるので。

:600エントリは、なしです。 600個の要素は現代のハードウェア上で数千分の一瞬で処理されます。

だから本当の答え:本当に問題になるまでパフォーマンスについて心配しないでください。そして、あなたのプロファイルの実用的なボトルネックを修正するためのアプリケーションです。あなたは、このようにフィルタリングすることができたJava 8で

1

List<TestAnswerModel> filterArrayList = myMainArrayList.stream() 
    .filter(m -> m.isAttempeted()).collect(Collectors.toList()); 

600個のオブジェクトのリストは、あなたが取るに関係なく近づいて何の時間のわずかな量でろ過する必要があります。他の人が言ったように、あなたのパフォーマンスの問題はおそらくコードのどこかにあります。

+0

文法的には@halferですが、isAttempeted()はOPがそのクラスでメソッドを定義した方法です。 –

+0

ああ、感謝しなかった - ありがとう! – halfer

関連する問題