- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试学习 Java 8 的功能,尤其是它的函数式编程方面。所以我试图解决一个问题:在数组中查找领导者 - 领导者是一个比数组中右侧所有元素都大的元素。
例如:
输入数组:{ 98, 23, 54, 12, 20, 7, 27 }
输出:领导者 - 27 54 98
现在,我已经使用通常的迭代方法解决了这个问题,如下所示。
private static void findLeaders(int[] array) {
int currentLeader = array[array.length - 1];
System.out.println(currentLeader);
for(int i = array.length - 1; i >= 0; i--) {
if(array[i] > currentLeader) {
System.out.println(array[i]);
currentLeader = array[i];
}
}
}
我尝试使用 Java 8 解决这个问题,但除了编写这段代码之外我无能为力,该代码再次出现编译错误:
Function<Integer, Integer> checkLeader = i -> i > currentLeader ? i : currentLeader;
Error: Local variable currentLeader defined in an enclosing scope must be final or effectively final
现在我如何使用 Java 8 的功能解决同样的问题。
最佳答案
传统的命令式方法对我来说似乎是最好的方法,同时考虑到性能和可读性/易于维护。尽管如此,这是我使用流和一些函数式编程的尝试:
List<Integer> leaders = IntStream.rangeClosed(1, array.length)
.mapToObj(i -> array[array.length - i])
.collect(toLeaders());
在这里我创建了一个 1..n
封闭范围,然后在mapToObj
内,转换索引1
至n - 1
,索引2
至n - 2
, 等等。我立即使用这个转换后的索引来获取数组的相应元素,最终在自定义收集器的帮助下将其收集到列表中。此自定义收集器由 toLeaders()
返回辅助方法:
private static Collector<Integer, ?, List<Integer>> toLeaders() {
BiConsumer<List<Integer>, Integer> accumulator = (leaders, n) -> {
if (leaders.isEmpty() || n > leaders.get(leaders.size() - 1)) {
leaders.add(n);
}
};
return Collector.of(ArrayList::new, accumulator, (leaders1, leaders2) -> {
leaders2.forEach(n -> accumulator.accept(leaders1, n));
return leaders1;
});
}
BiConsumer<List<Integer>, Integer> accumulator
接受两个值:包含迄今为止找到的领导者的列表,以及流中的元素。这个 Biconsumer
检查给定的数字是否是领导者,如果检查成功,则将该数字添加到给定的领导者列表中。
然后,通过 Collector.of
创建使用该累加器的收集器。实用程序,它也接受 Supplier
将容纳领导者的可变结构(这是 ArrayList::new
)和 BinaryOperator
组合器负责合并先前创建的两个领导者列表(仅当流并行时才使用)。该组合器使用先前声明的 accumulator
双消费者。
关于lambda - Java 8 - 查找数组中的领导者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44319044/
我试图在未排序的堆栈中找到多数或领导者,但我的 tos(堆栈顶部变量)遇到了问题。下面是我的代码,其中包含主要内容。数组或堆栈的大部分是在数组中出现次数超过一半的元素 (arrSize/2)。 pub
我刚刚阅读了一篇关于 Leader/Follower Pattern 的论文。如果我理解正确,我将我的工作人员放在一个队列中,第一个工作人员接受传入请求并从队列中分离。 使用正常的工作队列(例如 ra
我是一名优秀的程序员,十分优秀!