Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在几个转换之间共享值?_Java_Design Patterns_Guava - Fatal编程技术网

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));
}