2017-08-08 103 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; 
    } 

} 

以上是我的模型我想要的是我需要得到具有試圖值爲true的數據。這是我的:

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

是我上面的方法是最快的方法嗎? –

+1

這是非常主觀的問題,但你能回答我最初的問題嗎? –

回答

3

您希望收集符合特定條件的列表中的所有條目。順序循環基本上是最快的方式。如果您希望列表元素的5%或95%顯示在結果列表中,則不會產生影響 - 您必須查看所有條目以計算結果列表!

當然,你可以把到streams和過濾 - 因爲這將允許您使用列表的parallelStream()和處理部分並行。

但是:600個條目是什麼都沒有。在瞬息萬變的瞬間,600個元素在現代硬件上處理。

所以回答:不要擔心性能,直到它真的成爲一個問題。然後你配置文件你的應用程序識別真正的性能瓶頸來解決這個問題。

1

在Java 8可以過濾這樣的:

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

600個對象的列表應以微不足道的時間通過過濾不管什麼辦法,你拿。和其他人一樣,你的性能問題可能在代碼中的其他地方。

+0

@halfer,從語法上講是肯定的,但isAttempeted()是OP如何在他的班級中定義該方法。 –

+0

啊對,沒有發現 - 謝謝! – halfer