0

次の値のリストがあるとします。

List<String> values = Lists.asList("a", "a", "b", "c");

ここで、すべての値にインデックスを追加して、リストとしてこれになるようにします。

a1 a2 b1 c1 // imagine numbers as subscript

FluentIterableそのために aとそのメソッドを使用したいtransformので、次のようにします。

from(values).transform(addIndexFunction);

それに関する問題はaddIndexFunction、インデックスがすでに増加した頻度を知る必要があることです-a2これにインデックスを追加するときaに、関数は既にa1.

それで、そのようなことをするためのある種のベストプラクティスはありますか? 私の現在の考えは、各文字をキーとしてマップを作成することです。

Map<String,Integer> counters = new HashMap<>();
// the following should be generated automatically, but for the sake of this example it's done manually...
counters.put("a", 0);
counters.put("b", 0);
counters.put("c", 0);

次に、変換呼び出しを変更します。

from(values).transform(addIndexFunction(counters));

Map はオブジェクトであり、参照によって渡されるため、変換間でカウンターの状態を共有できるようになりましたね。フィードバック、より良いアイデアはありますか? Guava には、そのようなことのための組み込みメカニズムがありますか?

ヒントをありがとう!

4

2 に答える 2

3

Multisetを使用して HashMap を置き換えます。@Perception の提案に従って、関数自体に Multiset をカプセル化し、関数が適用されるときにデータを集約します。

于 2013-04-01T17:23:26.160 に答える