首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中有没有合并两个迭代器/数组的好方法?

在java中有没有合并两个迭代器/数组的好方法?
EN

Stack Overflow用户
提问于 2019-07-21 06:11:00
回答 4查看 175关注 0票数 0

我在解决编程作业时遇到的一个常见问题是,我有两个数组

我想用一个函数把它们组合起来

所以

例如,如果:

代码语言:javascript
复制
a = {1,2,3}
b = {3,4,5}
f = (i1, i2) -> i1 + i2

C应该是

代码语言:javascript
复制
c = {4,6,8}

我能想到的最好的解决方案是这样的:

代码语言:javascript
复制
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[]版本

代码语言:javascript
复制
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();
}
EN

回答 4

Stack Overflow用户

发布于 2019-07-21 06:40:55

怎么样

代码语言:javascript
复制
      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();

在本例中,数组的长度必须相同。

如果要添加相应的元素,请执行此操作。

代码语言:javascript
复制
      int[] both = IntStream.range(0, a.length).map(n -> a[n] + b[n]).toArray();
      System.out.println(Arrays.toString(both));
票数 0
EN

Stack Overflow用户

发布于 2019-07-21 06:54:58

看看芭乐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-

从文档中:

代码语言:javascript
复制
 Streams.zip(
   Stream.of("foo1", "foo2", "foo3"),
   Stream.of("bar1", "bar2"),
   (arg1, arg2) -> arg1 + ":" + arg2)

将会返回

代码语言:javascript
复制
Stream.of("foo1:bar1", "foo2:bar2"). 
票数 0
EN

Stack Overflow用户

发布于 2019-07-21 07:05:32

看看Streams.zip() from Guava吧。它将处理您已有的代码。除非您需要使用Streams.stream(iterable),因为Java iterable不直接支持流。

要处理原语,只需使用IntStream或等效项即可。

代码语言:javascript
复制
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);
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57128960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档