java - 有没有在java中合并两个迭代器/数组的好方法?
问题描述
我在解决编程作业时遇到的一个常见问题是我有两个数组,我想使用一个函数将它们组合起来。
例如,如果:
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();
}
解决方案
从文档:
Streams.zip(
Stream.of("foo1", "foo2", "foo3"),
Stream.of("bar1", "bar2"),
(arg1, arg2) -> arg1 + ":" + arg2)
将返回
Stream.of("foo1:bar1", "foo2:bar2").
推荐阅读
- java - 按升序对二维数组进行排序
- c# - System.ArgumentOutOfRangeException?
- c++ - 是否可以在 C++ 中获取 CHAR 的有效十六进制地址?
- mysql - 添加额外字段以防止需要连接
- asp.net-core - CORS 问题 asp.net core web api。不存在“Access-Control-Allow-Origin”标头
- c# - 如何在c#中将字符串值与字符串数组的元素进行比较?
- c# - Windows Forms C#的异步函数调用
- javascript - 需要帮助才能使 P5 画线功能正常工作
- reactjs - 如何检测何时在反应中的另一个组件中更改了切换状态
- jquery - 选择元素值为字符串