当前位置: 首页 > 知识库问答 >
问题:

在Java 8中,如何从N个数字中找到最大的M个数字?

彭衡
2023-03-14

IntStream可能是最简单的方法,但我只能获取最小的M数字,如下所示:

public class Test {
    private static final int[] arr = {5, 3, 4, 2, 9, 1, 7, 8, 6};

    public static void main(String[] args) throws Exception {
        System.out.println(Arrays.asList(IntStream.of(arr).sorted().limit(5).boxed().toArray()));
    }
}

顺便说一句,考虑算法复杂性并假设N

我认为最好的复杂性可能达到O(N log(M)),但我不知道Java 8是否有这种流方法或收集器。

共有3个答案

金晗日
2023-03-14

如果您已经在项目中使用google guava,您可以利用MinMaxPriorityQueue:

Collection<..> min5 = stream.collect(
    toCollection(MinMaxPriorityQueue.maximumSize(5)::create)
);
王楚青
2023-03-14

EJP是对的,我对它进行了测试-当输入值为2时,得到8和9。

import java.util.stream.IntStream;
public class Test {
    private static final int[] arr = {5, 3, 4, 2, 9, 1, 7, 8, 6};

    public static void main(String[] args) throws Exception { 
        int n = Integer.parseInt(args[0]);
        System.out.println("Finding "+n+" largest numbers in arr");
        IntStream.of(arr).sorted().skip(arr.length-n).boxed().forEach(big -> System.out.println(big));
    }
}
章睿
2023-03-14

如果必须使用流:

IntStream.of(arr).sorted().skip(N-M)

否则,使用优先级队列(PriorityQueue)并编写一个反向比较器(inversing Comparator)。插入为O(N(log(N)),移除M个元素为O(M(log(N))。不是你想要的,但可能足够近了。

 类似资料:
  • 我有一个数组,我需要三个数中最大的一个数和各自的索引值。我有一个这样的数组: 如何找到最大的数字及其索引值?

  • 给定一个从1到n的序列,我想找到所有大小为m的唯一子序列,求和到n。子序列不需要是连续的。例如 到目前为止,我已经能够使用递归生成所有的子序列,但我的代码并不是只返回唯一的子序列,结果中有一些重复的子序列。 当用 结果是 正如您所看到的,{3,2}是{2,3}的副本。我如何改变我的代码,使它只返回唯一的序列?

  • 我试图学习分布式计算,并遇到了一个寻找大量数字的中位数的问题: 假设我们有一大组数字(假设元素数为 N*K),它们无法放入内存(大小为 N)。我们如何找到这些数据的中位数?假设在内存上执行的操作是独立的,即我们可以考虑有K台机器,每台机器最多可以处理N个元素。 我认为中位数可以用于这个目的。我们可以一次将N个数装入内存。我们在< code>O(logN)时间内找到该集合的中值,并保存它。 然后我们

  • 问题内容: 如果不使用数组,我可以得到最大的数组,但是无法获得最小的数组。 最小的代码。 问题答案:

  • 问题内容: 有什么简单的方法或功能可以确定python列表中的最大数量?我只可以编写代码,因为我只有三个数字,但是如果我可以使用内置函数或类似的东西告诉最大的代码,那么它将使代码的冗余度降低很多。 问题答案: 关于什么

  • 问题内容: 想知道如何编写SQL函数以查找表中的第N个最大元素,如果没有第N个最大元素,则返回Null。 使用MySQL / MySQL工作台。 顺便说一句,我的问题与第N个最高薪水问题不同,因为我还有一个附加要求,如果第N个最大元素不存在,则返回Null。任何想法表示赞赏。 预先感谢林 问题答案: 您可以这样做: