我想返回的数字,只要它福尔斯在一个限制,否则返回的最大值或最小值的限制。我可以用Math.min和Math.max的组合来实现这一点。
Math.min
Math.max
public int limit(int value) { return Math.max(0, Math.min(value, 10)); }
我想知道是否有一个我忽略的现有limit或range函数。如果第三方库很常见,欢迎使用(例如:Commons或Guava)
limit
range
dz6r00yl1#
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); }
可惜标准的数学库缺少这些
qpgpyjmq2#
我知道这是Java的要求。在Android世界中,结合使用Kotlin和Java是很常见的。如果一些Kotlin用户到达这里(就像我一样),那么他们可以使用coerceIn扩展函数: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 Documentation。
xesrikrc3#
从版本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。我也很震惊,无论是下议院朗和下议院数学有它!:(
Ints.constrainToRange()
constrainToRange([type] value, [type] min, [type] max)
min
max
u0sqgete4#
如果你在Android上,使用MathUtils(在支持库中),它只有一个专门做这个的函数,叫做clamp。该方法采用数值并确保其适合给定的数值范围。如果数字小于范围所需的最小值,则返回范围的最小值。如果数字大于范围允许的最大值,则返回范围的最大值。
amrnrhlw5#
Math.max(int a, int b)函数定义为:
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 ); }
piwo6bdm6#
任何实现Comparable的类(包括Number及其子类)的泛型方法:
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或long与int等进行比较是不正确的。例如(double) 0.1 != (float) 0.1。
float
double
long
int
(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)直接改变第一个参数是不可能的,因为基本类型是不可变的。
limit(x, 12.0, 13.0)
wmtdaxz37#
Java 21中添加了新的Math.clamp方法(具有多个重载),可以方便地将数值夹在指定的最小值和最大值之间:
Math.clamp
int valueToClamp = 0; System.out.println(Math.clamp(valueToClamp, 1, 10)); // 1
public static int clamp(long value, int min, int max)
value
vh0rcniy8#
你不需要一个外部的库,试试这个测试用例:
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; } }
8条答案
按热度按时间dz6r00yl1#
OP要求在标准库中实现:
可惜标准的数学库缺少这些
qpgpyjmq2#
我知道这是Java的要求。在Android世界中,结合使用Kotlin和Java是很常见的。如果一些Kotlin用户到达这里(就像我一样),那么他们可以使用
coerceIn
扩展函数:Kotlin代码:
阅读更多关于官方Kotlin Documentation。
xesrikrc3#
从版本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。我也很震惊,无论是下议院朗和下议院数学有它!:(
u0sqgete4#
如果你在Android上,使用MathUtils(在支持库中),它只有一个专门做这个的函数,叫做clamp。
该方法采用数值并确保其适合给定的数值范围。如果数字小于范围所需的最小值,则返回范围的最小值。如果数字大于范围允许的最大值,则返回范围的最大值。
amrnrhlw5#
Math.max(int a, int b)
函数定义为:因此,您可以组合
max
和min
函数,如下所示:piwo6bdm6#
任何实现
Comparable
的类(包括Number
及其子类)的泛型方法:唯一的要求是所有参数必须属于同一类。它可以防止可能的类型转换丢失。事实上,将
float
与double
或long
与int
等进行比较是不正确的。例如(double) 0.1 != (float) 0.1
。用法:
不幸的是,仅仅通过
limit(x, 12.0, 13.0)
直接改变第一个参数是不可能的,因为基本类型是不可变的。wmtdaxz37#
Java 21中添加了新的
Math.clamp
方法(具有多个重载),可以方便地将数值夹在指定的最小值和最大值之间:public static int clamp(long value, int min, int max)
value
-箝位值min
-允许的最小值max
-最大允许值vh0rcniy8#
你不需要一个外部的库,试试这个测试用例: