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());
假设我有一个整数列表: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());