首页 > 解决方案 > 如何使用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 循环的解决方案。任何帮助表示赞赏。

标签: javaduplicatesmax

解决方案


你快到了,当你找到一个更大的数字时,你只是忘了清理你的列表:

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();
}

推荐阅读