46

只要数字在限制范围内,我想返回,否则返回限制的最大值或最小值。我可以通过 和 的组合来做到这Math.min一点Math.max

public int limit(int value) {
    return Math.max(0, Math.min(value, 10));
}

我想知道是否存在我忽略的现有功能limit或功能。 如果第三方库很常见(例如:Commons 或 Guava),则欢迎它们range

4

7 回答 7

30

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);
}

遗憾的是标准数学库缺少这些

于 2014-03-31T08:59:44.377 回答
11

从版本 21 开始,Guava包括Ints.constrainToRange()(以及其他原语的等效方法)。从发行说明

添加了将给定值约束到由和值constrainToRange([type] value, [type] min, [type] max)定义的封闭范围的方法。如果它在范围内,它们返回值本身,如果它低于范围,如果它高于范围。minmaxminmax

@dimo414从https://stackoverflow.com/a/42968254/122441复制。

不幸的是,这个版本是 2017 年 7 月的最新版本,并且在某些项目中(请参阅https://stackoverflow.com/a/40691831/122441)Guava已经破坏了向后兼容性,需要我暂时保留版本 19。我也很震惊,Commons Lang 和 Commons Math 都没有它!:(

于 2017-07-20T12:22:41.907 回答
11

如果您使用的是 Android,请使用 MathUtils(在支持库中),它只有一个专门执行此操作的函数,称为钳位。

此方法采用数值并确保它适合给定的数值范围。如果数字小于范围所需的最小值,则返回范围的最小值。如果数字高于范围允许的最大值,则将返回范围的最大值。

于 2018-04-03T20:55:30.940 回答
10

我知道这是对 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 官方文档的信息。

于 2019-07-15T20:02:19.067 回答
5

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 );
}
于 2014-03-31T09:04:36.893 回答
4

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;
}

唯一的要求是所有参数必须属于同一类。它可以防止可能的类型转换丢失。事实上,floatdoubleof longwithint等比较是不正确的。例如(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)不幸的是,仅仅因为原始类型是不可变的,就不可能直接更改第一个参数。

于 2016-05-26T11:44:26.537 回答
-5

您不需要为此使用外部库,请尝试以下测试用例:

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;
    }

}
于 2013-07-29T20:54:13.827 回答