Java:将整数舍入到给定列表的元素

Java: Round an Integer to an element of a given List

假设我有一个整数列表:ints = {0,10,20,30,40,50} 和一个输入值 input = 17

如何获得列表中最接近给定输入的整数?对于我的示例,它将是 20.

或者重申问题:如何将输入四舍五入到列表中最接近的值?

我在 Java 中找不到执行类似操作的函数

一个算法:

  • 遍历列表。
  • 对于每个元素,将该元素与输入值进行比较。
  • 如果输入值比当前元素,迭代到下一个元素。
  • 如果输入值大于所有个元素,return一些哨兵值(MAX_VALUE)或其他东西。
  • 如果输入值比给定元素,则它已充分四舍五入,您将return该元素。

有多种方法可以计算舍入 向下;你只需要扭转不平等的方向。半舍入留作 reader.

的练习

Java 中没有任何东西可以准确地做到这一点,因为它通常不是特别有用的东西。

一种方法是注意您正在寻找与 input 的最小偏差,也就是说,abs(number - input) 最接近 0 的值。

利用这些知识,我们可以创建一个 Comparator,根据数字与输入的距离比较数字,并根据此比较器选择最小的数字:

List<Integer> ints = List.of(0, 10, 20, 30, 40, 50);
int input = 17;

Comparator<Integer> distanceFromInputComparator = 
        Comparator.comparing(value -> Math.abs(value - input));

System.out.println(ints.stream().min(distanceFromInputComparator).orElseThrow());

这个returns 20,按要求。

此实现有一些注意事项,如有必要可以解决。如果输入列表为空,它目前会抛出异常。如果有两个最接近的(例如,如果 14 和 20 在列表中并且输入为 17,则未指定 Stream.min() 将选择哪个),它也会任意选择,因为根据比较器。

要解决决胜局,如果它们是等距的,您可以添加二次比较。例如,您可以执行以下任一操作:

// Pick the smaller when there's a tie
Comparator<Integer> distanceFromInputComparator = Comparator
        .comparing((Integer value) -> Math.abs(value - input))
        .thenComparing(Comparator.naturalOrder());

// Pick the larger when there's a tie
Comparator<Integer> distanceFromInputComparator = Comparator
        .comparing((Integer value) -> Math.abs(value - input))
        .thenComparing(Comparator.reverseOrder());