当我从参数接收到 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_VALUE
,Math.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.<Integer>comparingInt(i -> Math.abs(i - givenValue)).thenComparing(i -> i)
不知道它已经对您的解决方案起作用了!
当与givenValue
的距离相同时,答案中的代码将返回可迭代的第一个。如果您想要两个值中较小的一个,则必须添加 thenComparing
(在两个版本中尝试 findClosestNumbers(4, Arrays.asList(1, 5, 3, 0, 2, 6), 1)
,您会看到)。以上是关于当我从参数接收到 Iterable 时,如何使用带有 java8 的 Lamba 表达式从给定值中找到最接近的数字? [复制]的主要内容,如果未能解决你的问题,请参考以下文章