ハフマンコーディングプロトタイプの作成に興味があります。そのために、入力を構成する文字のヒストグラムを作成することから始めます。Java String
私は、SOおよび他の場所で多くのソリューション(例を見てきました:。hereStream
のためcollect()
方法を使用してだけでなく、非常に具体的かつ直感的な方法でFunction.identity()
とCollectors.counting()
の静的な輸入に依存IntStreamのヒストグラムマップを作成するとコンパイル時エラーが発生する
をただし、使用している場合Iは上記にリンクされたものと不気味なコードの断片は:
private List<HuffmanTrieNode> getCharsAndFreqs(String s){
Map<Character, Long> freqs = s.chars().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
return null;
}
Iは、本質的に、必要に応じて、Supplier
タイプに準拠collect
に引数が存在しないことを私に告げるのIntelliJからコンパイル時エラーを受け取りますその署名によって:
残念ながら、私は、Java 8 Stream
階層に新たなんだと私は私のために最善の行動がどうあるべきか全くわかりません。実際には、Map
の方法は、私がしようとしていることに対してあまりにも多くの定型文句であるかもしれません。もしそうなら、助言してください。
' codePoints() 'によって生成されたストリームが' char'sの代わりにコードポイントをカウントするという事実が問題であれば、 'chars()'をOPはそうです。自分で作成した問題を回避しようとしています。 – Holger
@Holger hmm ..あなたは正しいかもしれません。 "人間が読める人物"と何回繰り返したのかを知りたければ、単純に 's.codePoints()。mapToObj(x - > new String(Character.toChars(x))) – Eugene
「人間が判読できる文字」は別のものです。 '' char ''があります。これらの16ビット単位は、1:1または2:1を*コードポイント*にマップすることができますが、(人間が判読可能な)*文字*は、 'U + 0041 U + 0308'、どちらも* BMP内*なので、 "charとvs code point"の問題を "code point vs character(またはgrapheme cluster)"の問題と混同しないことが重要です。最後の2つの例は*文字*に分割されていますが、そのワームの缶を開くには、どの文字が同じかを理解していないことに注意する必要があります。 'U + 0041 U + 0308'は' U + 00C4'と同じです... – Holger