只要数字在限制范围内,我想返回,否则返回限制的最大值或最小值。我可以通过 和 的组合来做到这Math.min
一点Math.max
。
public int limit(int value) {
return Math.max(0, Math.min(value, 10));
}
我想知道是否存在我忽略的现有功能limit
或功能。
如果第三方库很常见(例如:Commons 或 Guava),则欢迎它们range
OP 要求在标准库中进行此实现:
int ensureRange(int value, int min, int max) {
return Math.min(Math.max(value, min), max);
}
boolean inRange(int value, int min, int max) {
return (value>= min) && (value<= max);
}
遗憾的是标准数学库缺少这些
从版本 21 开始,Guava包括Ints.constrainToRange()
(以及其他原语的等效方法)。从发行说明:
添加了将给定值约束到由和值
constrainToRange([type] value, [type] min, [type] max)
定义的封闭范围的方法。如果它在范围内,它们返回值本身,如果它低于范围,如果它高于范围。min
max
min
max
@dimo414从https://stackoverflow.com/a/42968254/122441复制。
不幸的是,这个版本是 2017 年 7 月的最新版本,并且在某些项目中(请参阅https://stackoverflow.com/a/40691831/122441)Guava已经破坏了向后兼容性,需要我暂时保留版本 19。我也很震惊,Commons Lang 和 Commons Math 都没有它!:(
如果您使用的是 Android,请使用 MathUtils(在支持库中),它只有一个专门执行此操作的函数,称为钳位。
此方法采用数值并确保它适合给定的数值范围。如果数字小于范围所需的最小值,则返回范围的最小值。如果数字高于范围允许的最大值,则将返回范围的最大值。
我知道这是对 Java 的要求。在 Android 世界中,结合使用 Kotlin 和 Java 是很常见的。如果某些 Kotlin 用户到达这里(就像我一样),那么他们可以使用coerceIn
扩展功能:
科特林代码:
println(10.coerceIn(1, 100)) // 10
println(10.coerceIn(1..100)) // 10
println(0.coerceIn(1, 100)) // 1
println(500.coerceIn(1, 100)) // 100
阅读更多关于Kotlin 官方文档的信息。
Math.max(int a, int b)
函数定义为:
public static int min(int a, int b) {
return (a <= b) ? a : b;
}
因此,您可以按如下方式组合max
和功能:min
private static int MAX=10;
private static int MIN=0;
public int limit(int a) {
return (a > MAX) ? MAX : (a < MIN ? MIN: a );
}
Comparable
任何实现类(包括Number
及其子类)的通用方法:
public static <T extends Comparable<? super T>> T limit(T o, T min, T max){
if (o.compareTo(min) < 0) return min;
if (o.compareTo(max) > 0) return max;
return o;
}
唯一的要求是所有参数必须属于同一类。它可以防止可能的类型转换丢失。事实上,float
与double
of long
withint
等比较是不正确的。例如(double) 0.1 != (float) 0.1
。
用法:
double x = 13.000000001;
x = limit(x, 12.0, 13.0);
System.out.println("x = " + x); //x = 13.0
limit(x, 12.0, 13.0)
不幸的是,仅仅因为原始类型是不可变的,就不可能直接更改第一个参数。
您不需要为此使用外部库,请尝试以下测试用例:
public class RandomNumber {
public static void main(String[] Args) {
System.out.println("random = " + randomInRange(5,10));
}
public static double randomInRange(double arg1, double arg2) {
double my_number = Math.ceil(Math.random() * (arg1 - arg2) + arg2);
return my_number;
}
}