簡體   English   中英

Java - 最小和最大之間的限制數

[英]Java - limit number between min and max

只要數字在限制范圍內,我就想返回它,否則返回限制的最大值或最小值。 我可以結合Math.minMath.max來做到這一點。

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

我想知道是否存在我忽略的現有limitrange函數。
如果非常常見,歡迎使用 3rd 方庫(例如:Commons 或 Guava)

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

可惜標准的 Math 庫缺少這些

從版本 21 開始, Guava包含Ints.constrainToRange() (以及其他原語的等效方法)。 發行說明

添加了constrainToRange([type] value, [type] min, [type] max)方法,該方法將給定值限制在由minmax定義的封閉范圍內。 他們返回本身的價值,如果它的范圍之內, 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(在支持庫中),它只有一個專門執行此操作的函數,稱為clamp。

此方法采用數值並確保它適合給定的數值范圍。 如果數字小於范圍所需的最小值,則將返回范圍的最小值。 如果數字高於范圍允許的最大值,則將返回范圍的最大值。

我知道這是針對 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;
}

因此,您可以按如下方式組合maxmin函數:

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

唯一的要求是所有參數必須屬於同一類 它可以防止可能的類型轉換丟失。 事實上,將floatdouble of longint等進行比較是不正確的。例如(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)因為原始類型是不可變的。

您不需要為此使用外部庫,請嘗試以下測試用例:

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM