2017-12-24 15 views
-2

配列内の単語の頻度を数える必要があります。結果を処理する(entrySetでなければならないと思う)... entrySetの順序も重要です。配列をLinkedHashMapに変換する必要があると思います。Java 8ストリーム。配列をLinkedHashMapに変換し、単一ストリームのentrySetで作業を続行してください

Map<String, Integer> map = new LinkedHashMap<>(); 
for(String word : words) { 
     Integer count = map.get(word); 
     count = (count == null) ? 1: ++count; 
     map.put(word, count); 
}  

次の解決策が見つかりましたが、その順序は尊重されていません。 そして、そのストリームを収集操作なしで使用することは可能ですか(マップまたはフラットマップを使用しています)?

Map<String, Long> collect = 
    wordsList.stream().collect(groupingBy(Function.identity(), counting())); 

ありがとうございます。

+0

なぜこのグループ化コレクターがLinkedHashMapを作成する必要があると思いますか?グループ化する他のコレクタはありませんが、作成するマップの種類を指定することはできますか?コレクターズのjavadocを読んだことはありますか? –

+0

@JBnizet、私はgroupingByコレクターが自分の仕事でうまく見えるが、LinkedHashMapを作成しないと分かっている...私はちょうど注文を維持する方法を尋ねる... と同じストリームを使用して、 ... –

+0

私はそれを理解しています。私の指摘は、javadocを読んだだけでは、自分で答えを見つけることができるということです。読書のドキュメントは、自律的で生産的なプログラマーになる鍵です。 –

答えて

0

あなたが近いだが、あなたは、このような3つの引数を取りgroupingByコレクタを使用する必要があります:あなたが欲しいので、groupingByコレクタはサプライヤーであることにし、あなたのケースでは二番目の引数

LinkedHashMap<String, Long> resultSet = 
       wordsList.stream() 
         .collect(groupingBy(Function.identity(), 
             LinkedHashMap::new, 
              counting())); 

LinkedHashMapこれはあなたが上記のように提供する必要があるものです。

+0

ありがとう!それは仕事です。もう1つの質問。それを収集せずに変換する方法は? 変換後、このストリームを引き続き使用したいと考えています。入力値で並べ替える場合...結果マップから新しいストリームを作成する必要がありますか?または、いくつかの魔法(例:mapまたはflatMap)がありますか? –

+0

@A。私が今考えることができる1つの解決策は、['collectingAndThen'](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#)を使用することです。 collectAndThen-java.util.stream.Collector-java.util.function.Function-)コレクタを使用して、groupingByの後にフィニッシング関数を適用し、新しいストリームを作成して値でソートする必要がある値以外の値でソートします。 –

関連する問題