首页 > 解决方案 > 有没有在java中合并两个迭代器/数组的好方法?

问题描述

我在解决编程作业时遇到的一个常见问题是我有两个数组一,乙,我想使用一个函数将它们组合斧头-> c起来C

例如,如果:

a = {1,2,3}
b = {3,4,5}
f = (i1, i2) -> i1 + i2

c应该是

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 行代码的问题开始新的家庭作业。

有这样做的标准库方式吗?

编辑:双[]版本

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

标签: javaarraysiterator

解决方案


看看番石榴Streams.ziphttps://static.javadoc.io/com.google.guava/guava/21.0/com/google/common/collect/Streams.html#zip-java.util.stream.Stream-java。 util.stream.Stream-java.util.function.BiFunction-

从文档:

 Streams.zip(
   Stream.of("foo1", "foo2", "foo3"),
   Stream.of("bar1", "bar2"),
   (arg1, arg2) -> arg1 + ":" + arg2)

将返回

Stream.of("foo1:bar1", "foo2:bar2"). 

推荐阅读