java - Find second min element from array
问题描述
Anyone can convert this in the Java functional style (lambda):
public int findSecondMin(int arr[]) {
int min = Integer.MAX_VALUE, secondMin = Integer.MAX_VALUE;
for (int i = 0; i < arr.length; i++) {
if (min > arr[i]) {
secondMin = min;
min = arr[i];
} else if (secondMin > arr[i]) {
secondMin = arr[i];
}
}
return secondMin;
}
I tried by applying the filter over this but it is not working.
解决方案
使用IntStream
,您可以轻松对其进行排序并跳过第一个元素:
public int findSecondMin(int[] arr)
{
return IntStream.of(arr).sorted().skip(1).findFirst().orElse(Integer.MAX_VALUE);
}
但是,当然,您不必使用流。java.util.Arrays
有一个不错的排序方法,然后你可以只取第二个元素:
public int findSecondMin(int[] arr)
{
Arrays.sort(arr);
return arr.length < 2 ? Integer.MAX_VALUE : arr[1];
}
为避免对整个数组进行排序,我们可以采用您的方法并将其调整为流上的自定义归约:
public int findSecondMin(int[] arr)
{
return IntStream.of(arr).boxed().reduce(
new int[] {Integer.MAX_VALUE, Integer.MAX_VALUE},
(mins, i) -> {
return new int[] {Math.min(i, mins[0]), Math.min(Math.max(i, mins[0]), mins[1])};
}, (mins1, mins2) -> {
int[] lesser = mins1[0] < mins2[0] ? mins1 : mins2;
int[] larger = mins1[0] < mins2[0] ? mins2 : mins1;
return new int[] {lesser[0], Math.min(lesser[1], larger[0])};
}
)[1];
}
与基于 for 循环的实现相比,它可能更难阅读,但可以并行工作。
推荐阅读
- java - 单元测试不能通过
- javascript - 尽快:恶意软件清除 javascript
- javascript - 在 POST 到服务器之前将捕获的 getUserMedia 视频保存到文件
- python - 如何修复'NameError:名称'russ_yaz'未定义'
- c# - ASP.NET MVC 应用程序中的登录过程总是失败
- wordpress - Wordpress 查询在 wp_query 中添加 0=1 并且结果消失
- html - 在网页中创建一个链接,允许通过加载指定的 kml 文件打开谷歌地球和/或谷歌地图
- prolog - 打印列表的元素,但以不同方式处理最后一个元素
- java - Springboot 容器使用 docker-compose 连接到 mongo 容器的 503 错误代码
- graphql - 如何解决“变异返回数据为空”?