0

想象一下,我有以下值列表:

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

现在我想为所有值添加一个索引,以便最终将其作为列表:

a1 a2 b1 c1 // imagine numbers as subscript

我想为此使用 aFluentIterable及其transform方法,所以是这样的:

from(values).transform(addIndexFunction);

问题在于,thataddIndexFunction需要知道索引已经增加的频率 - 想想a2,当向 this 添加索引时a,函数需要知道,已经有一个a1.

那么,是否有某种最佳实践来做这样的事情?我目前的想法是创建一个以每个字母为键的 Map ,所以:

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

不要transform在这里使用,否则每次迭代它时你的可迭代对象都会有不同的值,并且通常会表现得很奇怪。(在Function.

相反,使用助手进行适当的for循环:Multiset

Multiset<String> counts = HashMultiset.create();
List<Subscript> result = Lists.newArrayList();
for (String value : values) {
  int count = counts.add(value, 1);
  result.add(new Subscript(value, count));
}
于 2013-04-01T18:44:15.953 回答
3

使用Multiset替换 HashMap,您可以按照@Perception 的建议将 Multiset 封装在 Function 本身中,并在应用函数时聚合数据。

于 2013-04-01T17:23:26.160 回答