Java 在几个转换之间共享值?
假设我有以下值列表:Java 在几个转换之间共享值?,java,design-patterns,guava,Java,Design Patterns,Guava,假设我有以下值列表: List<String> values = Lists.asList("a", "a", "b", "c"); 我想使用a及其方法来实现这一点,比如: from(values).transform(addIndexFunction); 问题是,addIndexFunction需要知道,索引已经增加的频率-想想a2,当将索引添加到此a时,函数需要知道,存在一个a1 那么,做这样的事情有什么最佳实践吗?我目前的想法是创建一个以每个字母为键的地图,因此: Map&
List<String> values = Lists.asList("a", "a", "b", "c");
我想使用a及其方法来实现这一点,比如:
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);
由于Map是一个对象并通过引用传递,我现在可以在转换之间共享计数器状态,对吗?反馈,更好的想法?番石榴中是否有一些内置的机制
谢谢你的提示 按照@Perception的建议,使用a替换HashMap,您就可以开始了,将Multiset封装在函数本身中,并在应用函数时聚合数据。使用a替换HashMap,您就可以开始了,按照@Perception的建议,将多集封装在函数本身中,并在应用函数时聚合数据。不要在此处使用
transform
,否则每次迭代iterable时,iterable都会有不同的值,通常会表现得非常怪异。(在函数
中有状态也有点令人不快)
相反,使用Multiset
helper执行适当的for
循环:
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));
}
Multiset counts=HashMultiset.create();
列表结果=Lists.newArrayList();
for(字符串值:值){
int count=counts.add(值1);
添加(新的下标(值、计数));
}
不要在这里使用变换
,否则每次迭代iterable时,iterable都会有不同的值,通常表现得非常怪异。(在函数
中有状态也有点令人不快)
相反,使用Multiset
helper执行适当的for
循环:
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));
}
Multiset counts=HashMultiset.create();
列表结果=Lists.newArrayList();
for(字符串值:值){
int count=counts.add(值1);
添加(新的下标(值、计数));
}
我认为您不会找到为此而预先构建的任何东西。你的想法听起来不错,虽然我会将计数器映射封装在函数本身中,并且只为列表中的项目创建键(也称为惰性加载计数映射)。感谢你的反馈,惰性加载的想法听起来不错,但我没有想到:-)我想你不会找到为此预先构建的任何东西。你的想法听起来不错,虽然我会将计数器映射封装在函数本身中,并且只为列表中的实际项目创建键(也称为惰性加载计数映射)。感谢反馈,惰性加载的想法听起来不错,没有想到:-)多集的好主意,因此,在试图找出计数时,不必检查项目是否存在:-)谢谢!使用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));
}