当我从参数接收到 Iterable 时,如何使用带有 java8 的 Lamba 表达式从给定值中找到最接近的数字? [复制]

Posted

技术标签:

【中文标题】当我从参数接收到 Iterable 时,如何使用带有 java8 的 Lamba 表达式从给定值中找到最接近的数字? [复制]【英文标题】:How to find closest number from a given value using lamba expression with java8 when i receive an Iterable from the parameter? [duplicate] 【发布时间】:2021-02-12 16:43:24 【问题描述】:

就像使用列表一样,您可以键入:

public Iterable<Integer> findClosestNumbers(int givenValue, Iterable<Integer> numbers, int n)
    Iterable<Integer> closestNumbers;

    int closest = numbers.stream()
            .min(Comparator.comparingInt(i -> Math.abs(i - value)))
            .orElseThrow(() -> new NoSuchElementException("No value present"));


   return closestNumbers;

'givenValue' 表示它应该最接近的值

“数字”可以是数字数组 1, 2, 4, 5

“n”指定应返回的最接近该值的数字数量

像 value:6 和 n=2 那么结果应该返回 Iterable 4, 5

如何使用 Iterable 尽可能短地编写这个?我无法更改参数

【问题讨论】:

要么从可迭代对象创建一个流(参见链接的问题),要么使用常规循环和局部变量作为当前最接近的值。 请注意,对于有符号整数,两个int 值之间的距离可以大于int 值空间。一旦i - value 溢出,abs 就无法治愈。作为极端情况,如果距离恰好是Integer.MIN_VALUEMath.abs 的结果甚至可能是负数。只要数字很小,您的方法就可以正常工作…… 【参考方案1】:

如果您需要n 最接近的值的集合,则需要对结果进行排序和切片:

public Iterable<Integer> findClosestNumbers(int givenValue, 
          Iterable<Integer> numbers, int n) 

    return StreamSupport.stream(numbers.spliterator(), false)
            .sorted(Comparator.comparingInt(i -> Math.abs(i - givenValue)))
            .limit(n)
            .collect(Collectors.toList());

这将返回n(或更少)数字,按照与givenValue的距离升序排列。

【讨论】:

谢谢!如果有 2 个数字同样接近给定值,我只想要较小的值,例如 value=5、n=1,但最接近的数字=4 和 6? @RossoTheMan 然后使用Comparator.&lt;Integer&gt;comparingInt(i -&gt; Math.abs(i - givenValue)).thenComparing(i -&gt; i) 不知道它已经对您的解决方案起作用了! 当与givenValue 的距离相同时,答案中的代码将返回可迭代的第一个。如果您想要两个值中较小的一个,则必须添加 thenComparing(在两个版本中尝试 findClosestNumbers(4, Arrays.asList(1, 5, 3, 0, 2, 6), 1),您会看到)。

以上是关于当我从参数接收到 Iterable 时,如何使用带有 java8 的 Lamba 表达式从给定值中找到最接近的数字? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

当我使用 ionic 从 IOS 设备发送数据时,PHP 错误地接收到数据

python文件带参数时如何使用cProfile mod?

如何使用多个接收到的数组正确设置 ng-repeat

java 接收url中参数带 % %传过来的值

JList 和 ArrayList 更新

如何在 Spring Framework 中发送和接收带参数的 ajax 请求?