使用整数流的 Arg-min

Ere*_*evi 3 concurrency java-8 java-stream

我想使用 Java 流在 {1,...1000} 范围内找到一个整数 i,其中函数 sin(i/100) 最小。我尝试将 min 与比较器一起使用,如本问题所示:

    Comparator<Integer> sineComparator = (i,j) -> 
        Double.compare(Math.sin(i/100.0), Math.sin(j/100.0));
    IntStream.range(1,1000)
    .min(sineComparator);
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为 IntStream 没有接受比较器的 min 变体。我能做什么?

Mis*_*sha 5

您必须使用boxed()to convert IntStreamtoStream<Integer>允许您min与比较器一起使用:

IntStream.range(1, 1000)
            .boxed()
            .min(sineComparator)
Run Code Online (Sandbox Code Playgroud)

或者,您可以避免拳击,但代价是清晰度降低:

IntStream.range(1,1000)
            .reduce((i,j) -> sineComparator.compare(i, j) <= 0 ? i : j)
Run Code Online (Sandbox Code Playgroud)

另外,您可以使用Comparator.comparingDouble以下方法创建比较器:

Comparator<Integer> sineComparator = Comparator.comparingDouble(i -> Math.sin(i/100.0));
Run Code Online (Sandbox Code Playgroud)

  • 或者`(int)(150*Math.PI)`... (2认同)