2016-11-22 12 views
-3

java7プログラムをjava8に変換しようとしています。ストリームAPIを使用して以下の出力が必要です。ストリームを使用してリストから上位3カウントを取得

public List<String> getTopThreeWeatherCondition7() { 
    List<String> _Top3WeatherList = new ArrayList<String>(); 
    Map<String, Integer> _WeatherCondMap = getWeatherCondition7(); 
    List<Integer> _WeatherCondList = new ArrayList<Integer>(_WeatherCondMap.values()); 
    Collections.sort(_WeatherCondList, Collections.reverseOrder()); 
    List<Integer> _TopThreeWeathersList = _WeatherCondList.subList(0, 3); 
    Set<String> _WeatherCondSet = _WeatherCondMap.keySet(); 
    Integer count = 0; 
    for (String _WeatherCond : _WeatherCondSet) { 
     count = _WeatherCondMap.get(_WeatherCond); 
     for (Integer _TopThreeWeather : _TopThreeWeathersList) { 
      if (_TopThreeWeather == count) { 
       _Top3WeatherList.add(_WeatherCond); 
      } 
     } 
    } 
    _WeatherCondList = null; 
    _WeatherCondMap = null; 
    _TopThreeWeathersList = null; 
    _WeatherCondSet = null; 
    return _Top3WeatherList; 

} 
+0

によるタグ付けをより多くのユーザーに話すように複数のタグを設定してください。たとえば、java、java7、java8のように追加します。 – manuzi1

+0

getWeatherCondition7()。valueSet()。ストリーム()。ソート済み(Collections.reverseOrder())。limit(3).collect(Collections.toList ());これは、あなたが正しい方向にスタートする必要があります。 – AlexC

+1

私はこれを "Java 7プログラム"と呼んでいません。まず、標準の命名規則を使用します。つまり、変数名を '_' +大文字の代わりに小文字で開始します。第2に、使用後に変数を 'null'に代入しないでください。第3に、未使用のデフォルト( 'count = 0'のような)で変数を初期化しないでください。これらの問題を修正した後、これを「Javaプログラム」と呼ぶことができます。型パラメータを繰り返すのではなく、 "ダイヤモンド演算子" '<>'を使い始めると、 "Java 7 program"と呼ぶことができます。 – Holger

答えて

4

Javaコーディング規約に従うことを強く推奨します。変数名は、_ +大文字の代わりに小文字で開始します。次に、使用後にローカル変数をnullに割り当てないでください。これは時代遅れであり、コードの実際の目的からは逸脱しています。また、未使用のデフォルト値(count = 0など)で変数を初期化しないでください。この特定のケースでは、実際に使用される内部ループ内の変数も宣言する必要があります。

また、値ではなくIntegerの参照を比較していることにも注意してください。この特定のケースでは、オブジェクトが同じマップから生成されているので機能するかもしれませんが、それを避けるべきです。重複する値が存在するかどうかは明確ではありません。その場合、このループは正しいことをしません。また、entrySet()がキーと値を一緒に繰り返し処理することを許可しているので、keySet()を繰り返すべきではなく、すべてのキーに対してgetルックアップを実行するだけです。

このコードは「Java 7プログラム」であるべきだから、ジェネリッククラスの新しいインスタンスを作成するときにタイプ引数を繰り返す必要がなくなる「ダイヤモンド演算子」(<>)の存在を気にする必要があります。

値のみをソートして関連するキーを検索する代わりに、最初にエントリをソートする必要があります。

だからあなたの元のコードのクリーンJavaの7バリアントは、次のようになります。

static final Comparator<Map.Entry<String, Integer>> BY_VALUE_REVERSED= 
    new Comparator<Map.Entry<String, Integer>>() { 
     public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { 
      return Integer.compare(o2.getValue(), o1.getValue()); 
     } 
    }; 
public List<String> getTopThreeWeatherCondition7() { 
    List<String> top3WeatherList = new ArrayList<>(); 
    Map<String, Integer> weatherCondMap = getWeatherCondition7(); 
    List<Map.Entry<String, Integer>> entryList=new ArrayList<>(weatherCondMap.entrySet()); 
    Collections.sort(entryList, BY_VALUE_REVERSED); 
    List<Map.Entry<String, Integer>> topThreeEntries = entryList.subList(0, 3); 
    for(Map.Entry<String, Integer> entry: topThreeEntries) { 
     top3WeatherList.add(entry.getKey()); 
    } 
    return top3WeatherList; 
} 

また、これは正しく重複を処理します。 3位に同点がある場合にのみ、有効な候補者の1人だけが選出されます。


あなただけがきれいな出発点を持っている場合は、あなたが見ても、これは、Javaの恩恵を受けることができる方法8つの機能

  • の代わりに、それをソートするListにコンテンツをコピーし、あなたが作成することができます右MapからStream
  • あなたがはるかに簡単コンパレータを作成、あるいはあなたが制限のタスクをチェーンできる新しい組み込みコンパレータ
  • のいずれかを使用することができますをソートするために、ストリームを伝えますその結果3つの要素のキーにマップし、右、前の手順の流れに結果Listに収集する:
public List<String> getTopThreeWeatherCondition7() { 
    Map<String, Integer> weatherCondMap = getWeatherCondition7(); 
    List<String> top3WeatherList = 
     weatherCondMap.entrySet().stream() 
      .sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) 
      .limit(3) 
      .map(Map.Entry::getKey) 
      .collect(Collectors.toList()); 
    return top3WeatherList; 
} 
関連する問題