我在解决编程作业时遇到的一个常见问题是,我有两个数组
我想用一个函数把它们组合起来

所以

。
例如,如果:
a = {1,2,3}
b = {3,4,5}
f = (i1, i2) -> i1 + i2C应该是
c = {4,6,8}我能想到的最好的解决方案是这样的:
public static <A,B,C> Iterator<C> merge(Iterable<A> a, Iterable<B> b, BiFunction<A,B,C> f){
Iterator<A> ai = a.iterator();
Iterator<B> bi = b.iterator();
return new Iterator<>() {
@Override
public boolean hasNext() {
return ai.hasNext() && bi.hasNext();
}
@Override
public C next() {
return f.apply(ai.next(), bi.next());
}
};
}但是因为java处理泛型的方式和它处理泛型的方式一样,我还必须为原始数组(例如double[])创建专门的版本,这就放大了一个问题:我不想在每次开始新的家庭作业时都复制和粘贴100行代码。
有没有一种标准的库方法可以做到这一点?
编辑: double[]版本
public static double[] merge(double[] a, double[] b, DoubleBinaryOperator f){
return IntStream.range(0, Math.min(a.length, b.length)).mapToDouble(i -> f.applyAsDouble(a[i], b[i])).toArray();
}发布于 2019-07-21 06:40:55
怎么样
int[] a = { 1, 2, 3
};
int[] b = { 3, 4, 5
};
int[] both = IntStream.range(0, a.length).mapToObj(n -> new int[] { a[n], b[n]
}).flatMapToInt(r -> IntStream.of(r)).toArray();在本例中,数组的长度必须相同。
如果要添加相应的元素,请执行此操作。
int[] both = IntStream.range(0, a.length).map(n -> a[n] + b[n]).toArray();
System.out.println(Arrays.toString(both));发布于 2019-07-21 06:54:58
从文档中:
Streams.zip(
Stream.of("foo1", "foo2", "foo3"),
Stream.of("bar1", "bar2"),
(arg1, arg2) -> arg1 + ":" + arg2)将会返回
Stream.of("foo1:bar1", "foo2:bar2"). 发布于 2019-07-21 07:05:32
看看Streams.zip() from Guava吧。它将处理您已有的代码。除非您需要使用Streams.stream(iterable),因为Java iterable不直接支持流。
要处理原语,只需使用IntStream或等效项即可。
public class MergingIterators {
public static <A, B, C> Iterator<C> merge(
Iterable<A> a, Iterable<B> b, BiFunction<A, B, C> f) {
return Streams.zip(Streams.stream(a), Streams.stream(b), f);
}
public static Iterator<Integer> merge(
int[] a, int[] b, BiFunction<Integer, Integer, Integer> f) {
return Streams.zip(
IntStream.of(a).boxed(), IntStream.of(b).boxed(), f);
}
}https://stackoverflow.com/questions/57128960
复制相似问题