Google collectionsのForwarding系のForwardingMultisetは、どう使ったらいいかいろいろ考えて、以下のようなコードを作ってみました。 Multisetは、ヒストグラムとかするときに便利ですが、平均(追加回数を数えて置いて後で合計から割る)や最大値もあると必要あるかと思いました。 (詳しくはページ後ろの添付を見てみてください。) 表とかの順番がはっきりしている場合は、int配列とか使った方が速いケースがほとんどでしょうけどね。
こういう風に重ねて使います。これだと、とってもデコレーションパターンぽく見えますね。 Multiset<String> mset=LinkedHashMultiset.create(); CounterMultiSet<String> counter=new CounterMultiSet<String>(mset); MaxMultiSet<String> max=new MaxMultiSet<String>(counter); MinMultiSet<String> min=new MinMultiSet<String>(max); CounterMultisetカウンターマルチセットの場合、内部に別のMultisetを持って、追加されたら数値に関わらず増やすことで追加回数を記録します。 public int add(T element, int occurrences) { counter.add(element); return super.add(element, occurrences); } MaxMultisetMaxマルチセットの場合は、数値の追加時に、過去の最大値と比べて保存します。 public int add(T element, int occurrences) { if(occurrences>max.count(element)){ max.setCount(element, occurrences); } return super.add(element, occurrences); }
MinMultiset
public int add(T element, int occurrences) { if(occurrences<min.count(element)|| !min.contains(element)){ min.setCount(element, occurrences); } return super.add(element, occurrences); } |
Java ライブラリー > Google Collections Library >