2017-04-19 29 views
0

我用Java寫了這個功能:獲取最大價值,從自定義的ArrayList

public void calculateMax(Integer year){ 
    Double max = hoodDataList.get(0).getPercentage(); 
    if(year == 2006){ 
     for(Integer z = 0; z < hoodDataList.size(); z ++){ 

      if(hoodDataList.get(z).getYear() == 2006){ 
       if(hoodDataList.get(z).getPercentage() > max){ 
        max = hoodDataList.get(z).getPercentage(); 
       } 
      } 
     } 
    } 
    Toast.makeText(getActivity(), String.valueOf(max), 
      Toast.LENGTH_LONG).show(); 
} 

現在,如果我是正確的,應該計算出百分比的最大值,並存儲一個名爲max但不知何故變量中它停止迭代後第二個值

+0

與java有一段時間,但z ++與z ++相同 – brad

+0

提示:除非確實需要包裝器對象(如Integer),否則應始終使用基元。嘗試調試它,或者至少在每個元素上執行System.out.println()。從我看到的一切似乎都很好。也許你只有兩個元素是'if(hoodDataList.get(z).getYear()== 2006)'? – Cargeh

+0

從我看到這應該工作,至少你的列表包含一個或多個項目(否則提出一個IOOBE)的情況。你可以發佈你的物品清單嗎? –

回答

-1

但不知何故停止迭代後的第二個值。

我測試過你的代碼,存儲在hoodDataList中的自定義類型,但我似乎無法重現錯誤。

或者,你可以試試這個:

public void calculateMax(Integer year){ 
     if (year == 2006 && hoodDataList.stream().anyMatch(c -> c.getYear() == 2006)) 
     { 
      double max = hoodDataList.stream().filter(c -> c.getYear() == 2006). 
      max((c1, c2) -> Double.compare(c1.getPercentage(),c2.getPercentage())). 
      get().getPercentage(); 
      Toast.makeText(getActivity(), String.valueOf(max), 
      Toast.LENGTH_LONG).show(); 
     }else 
     { 
      //do something else 
     } 
} 

側面說明 - 如果你要使用for循環,不使用包裝類型(Integer)作爲索引,只是使用原始的int類型。

+1

爲什麼浪費2倍的內存呢?如果他有一個大名單呢?你可以使用一個過濾器,就像Jacob上面建議的 – Cargeh

-1

也許與this?不確定,因爲我預計不會導致迭代,並且max將始終設置爲hoodDataList.get(0).getPercentage(),但是您會說在第二次迭代後停止。

-1

與Java 8中,您可以使用以下命令:

hoodDataList.stream().filter(i -> i.getYear() == 2006).mapToDouble(i -> i.getPercentage()).max().getAsDouble(); 

注意hoodDataList應該是一個非空List,否則,你可以使用OptionalDouble#orElseGet提供Supplier<Double>返回默認值。

+0

肯定應該使用流,爲年添加過濾器... –

+0

我認爲這個問題的目的不是使用替代方法,而是在上面的代碼中找到錯誤。 –

+1

他需要檢查'getYear()'的元素是2006年。我認爲過濾器會是個好主意,是吧? – Cargeh