2017-04-19 9 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

としばらくお待ちください。z ++と同じです。++ – brad

+0

ヒント:本当にラッパーオブジェクト(Integerなど)が必要な場合を除き、常にプリミティブを使用してください。それをデバッグしようとするか、少なくともすべての要素に対してSystem.out.println()を実行してください。私はすべてがうまくいくように見えるから。おそらく、if(hoodDataList.get(z).getYear()== 2006) 'という2つの要素しかないでしょうか? – Cargeh

+0

あなたのリストに1つ以上のアイテムが含まれている場合は、少なくともこれが動作するはずです(それ以外の場合は100BEが発生します)。あなたはあなたの商品リストを投稿できますか? –

答えて

-1

しかし、何とか2番目の値の後に反復を停止します。

コードをテストしましたが、カスタムタイプは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倍のメモリを無駄にしますか?もし彼が大きなリストを持っていたら?あなたは上記のようにヤコブが提案したようにフィルタを使うことができます – Cargeh

-1

おそらくthisに関連していますか?私はそれが反復を起こさないと期待しているので確信が持てません。最大値は常にhoodDataList.get(0).getPercentage()に設定されますが、2回目の反復後に停止すると言います。

-1

のJava 8を使用すると、以下のように使用することができます。

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

hoodDataListことが非空でListする必要があり、そうしないと、デフォルト値を返しますSupplier<Double>を提供するために、OptionalDouble#orElseGetを使用することができます。

+0

ストリームを使って、今年のフィルタを追加する必要があります... –

+0

この質問の意図は、別のアプローチを使うのではなく、上記のコードでバグを見つけることです。 –

+1

彼は 'getYear()'が2006年であることをチェックする必要があります。私はフィルターが良いアイデアだろうと思いますか? – Cargeh

関連する問題