java - 如何使用Java查找给定列表中具有重复项的最大数字的索引
问题描述
我有一个值 [1,2,2,8,7,8] 的列表。我想找到最大数字的索引。这里最大的数字是 8。8 重复了两次。所以答案应该是 [3,5] 即两个 8 的索引。
我花了很多时间。我能够找到最大的数字。我无法找到一个干净且简单的解决方案来查找索引。
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Integer> parts = new ArrayList<>();
parts.add(1);
parts.add(2);
parts.add(2);
parts.add(8);
parts.add(7);
parts.add(8);
Test ob = new Test();
System.out.println("Indexs with max value:" + ob.getIndex(parts));
}
public List<Integer> getIndex(List<Integer> parts) {
int big = parts.get(0);
List<Integer> indexes = new ArrayList<>();
for (int i = 1; i < parts.size(); i++) {
if (big <= parts.get(i)) {
big = parts.get(i);
indexes.add(i);
}
}
System.out.println("Biggest Number:" + big);
return indexes;
}
}
上面的代码打印最大的数字并打印错误的索引,即每当索引进入 if 循环时,我都会向索引添加“i”值。我需要过滤,以便仅在值很大时才添加。我正在寻找没有两个 for 循环的解决方案。任何帮助表示赞赏。
解决方案
你快到了,当你找到一个更大的数字时,你只是忘了清理你的列表:
for (int i = 0; i < parts.size(); i++) {
if (big <= parts.get(i)) {
if (big < parts.get(i)) {
indexes.clear();
}
big = parts.get(i);
indexes.add(i);
}
}
更优雅但也更慢一点的解决方案是使用 Streams:
public List<Integer> getIndex(List<Integer> parts)
if (!parts.isEmpty()) {
int max = parts.stream().max(Integer::compare).get();
return IntStream.range(0, parts.size())
.filter(i -> parts.get(i) == max)
.boxed()
.collect(Collectors.toList());
}
return Collections.emptyList();
}
推荐阅读
- php - WooCommerce 自定义设置选项卡验证
- javascript - react js中的步进标签字体大小
- jquery - 如何从动态选择下拉列表中提取值
- kubernetes - Kubernetes url 上的 nginx 入口路由到主机
- visual-studio-code - 如何更改 Visual Studio Code 标记和标签字体?
- r - 多因素 T 检验
- uikit - SwifUI 通过实现 UIViewRepresentable 使用 UIKit 组件
- umbraco - Umbraco 8.0 登录问题
- github - github页面构建失败:超时
- javascript - Javascript 事件计时 + 3rd 方事件,寻找比 setTimeOut() 更好的选择