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);}MinMultisetpublic int add(T element, int occurrences) {if(occurrences<min.count(element)|| !min.contains(element)){min.setCount(element, occurrences); }return super.add(element, occurrences);} |