- 这是某个网站上的简单任务 *
如果a[i]〉B[i],则Alice将获得1分。如果a[i]〈b[i],则Bob将获得1分。如果a[i] = b[i],则两个人都不会获得1分。返回:爱丽丝的分数在第一位,鲍勃的分数在第二位。
- 我可以使用流来编写此代码吗 *
public static List<Integer> compareTriplets(List<Integer> a, List<Integer> b) {
int alice = 0;
int bob = 0;
for (int i = 0; i < a.size(); i++) {
if (a.get(i) > b.get(i))
alice++;
else if (a.get(i) < b.get(i))
bob++;
}
return Arrays.asList(alice, bob);
}
...
- 经过一番思考,我写了这段代码 *
public static List<Integer> compareTriplets(List<Integer> a, List<Integer> b) {
Integer[] result = {0, 0};
IntStream.range(0, Math.min(a.size(), b.size()))
.map(i -> a.get(i).compareTo(b.get(i)))
.forEach(i -> {
if (i > 0) result[0]++;
else if (i < 0) result[1]++;
});
return Arrays.asList(result);
}
但是这段代码并没有简洁多少,有没有办法让代码变得更漂亮?
3条答案
按热度按时间ejk8hzay1#
您可以使用
filter
和count
缩短代码,但在这里使用循环更简洁。Stream
并不总是解决方案。r3i60tvu2#
Java 8 -
partitioningBy()
和counting()
对于在给定数据集上执行仅一次迭代的流,解决该问题的方法之一是利用构建的收集器
partitioningBy()
和counting()
:Java 8 -自定义
Collector
另一种选择是使用静态工厂方法
Collector.of()
定义自定义收集器。与之前的方法一样,它允许使用单个流处理数据:Java 12 -收集器
teeing()
另一个允许使用单个流生成结果的选项是Java 12 Collector
teeing()
,它需要两个下游Collector和一个Function,后者通过合并它们生成的结果来执行最终转换。0x6upsns3#
这对于您的情况来说可能有些过分,但您可以将其作为流缩减来处理:
另一种方法是利用
Integer.compare
: