web-dev-qa-db-ja.com

Java-最小値と最大値の間の制限数

数値が制限内に収まる限り数値を返します。それ以外の場合は、制限の最大値または最小値を返します。 Math.minMath.maxの組み合わせでこれを行うことができます。

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

私が見落としている既存のlimitまたはrange関数があるかどうか疑問に思っています。
サードパーティのライブラリがかなり一般的であれば歓迎します(例:コモンズまたはグアバ)

40
Sean Connolly

バージョン21の時点で、 Guava には Ints.constrainToRange() (および他のプリミティブの同等のメソッド)が含まれています。 リリースノート から:

minおよびmaxの値で定義された閉じた範囲に特定の値を制約するconstrainToRange([type] value, [type] min, [type] max)メソッドを追加しました。範囲内にある場合は値自体を返し、範囲より下の場合はminを返し、範囲より上にある場合はmaxを返します。

https://stackoverflow.com/a/42968254/122441 から@ dimo414によってコピーされました。

残念ながら、このバージョンは2017年7月の時点でごく最近のものであり、一部のプロジェクトでは( https://stackoverflow.com/a/40691831/122441 を参照)今のところ19。また、Commons LangもCommons Mathも持っていないことにショックを受けました! :(

9
Hendy Irawan

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

残念なことに、標準の数学ライブラリにはこれらが欠けています

24
Barry Staes

Androidを使用している場合は、MathUtils(サポートライブラリ内)を使用します。これには、クランプと呼ばれるこれを具体的に行う関数が1つしかありません。

このメソッドは数値を受け取り、指定された数値範囲に収まるようにします。数値が範囲に必要な最小値より小さい場合、範囲の最小値が返されます。数値が範囲で許可されている最大値よりも大きい場合、範囲の最大値が返されます。

5
RJFares

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 );
}
4
Majid Laissi

ComparableNumberおよびそのサブクラスを含む)を実装するクラスの汎用メソッド:

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

唯一の要件は、すべての引数が同じクラスでなければならないであることです。型変換の損失を防ぎます。実際、floatdoublelongintなどと比較するのは正しくありません。たとえば、_(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)だけで最初の引数を直接変更することはできません。

3
Oleg Mikhailov

これがJavaに求められたことを理解しています。 Android world、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 Documentation をご覧ください。

1
HBB20