Подтвердить что ты не робот

Java - предельное число между min и max

Я хочу вернуть число до тех пор, пока оно попадает в лимит, иначе верните максимальное или минимальное значение предела. Я могу сделать это с помощью комбинации Math.min и Math.max.

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

Мне интересно, есть ли существующая функция limit или range, которую я пропускаю.
Сторонние библиотеки приветствуются, если они довольно распространены (например: Commons или Guava).

4b9b3361

Ответ 1

Начиная с версии 21, Guava включает Ints.constrainToRange() (и эквивалентные методы для других примитивов). Из заметок о выпуске:

добавлены методы constrainToRange([type] value, [type] min, [type] max) которые ограничивают данное значение закрытым диапазоном, определяемым значениями min и max. Они возвращают само значение, если оно находится в пределах диапазона, min если оно ниже диапазона, и max если оно выше диапазона.

Скопировано с fooobar.com/questions/139989/... @dimo414.

К сожалению, по состоянию на июль 2017 года, эта версия довольно недавняя, и в некоторых проектах (см. fooobar.com/questions/175867/...) у Guava была нарушена обратная совместимость, из-за чего я пока оставался на версии 19. Я также шокирован, что ни у Commons Lang, ни у Commons Math его нет! :(

Ответ 2

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 отсутствуют эти

Ответ 3

Если вы работаете на Android, используйте MathUtils (в библиотеке поддержки), у него есть только одна функция, которая специально выполняет это, как зажим.

Этот метод принимает числовое значение и обеспечивает его соответствие заданному числовому диапазону. Если число меньше минимума, требуемого диапазоном, то будет возвращен минимум диапазона. Если число больше максимума, допустимого диапазоном, то будет возвращен максимум диапазона.

Ответ 4

Функция 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 );
}

Ответ 5

Общий метод для любого класса, реализующего 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.

Применение:

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), поскольку примитивные типы неизменяемы.

Ответ 6

Я понимаю, что это было запрошено для Java. В мире Android принято использовать Kotlin и Java вместе. В случае, если некоторые пользователи Kotlin достигли здесь (как и я), они могут использовать coerceIn расширения 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.

Ответ 7

Это было сделано с помощью kotlin, надеюсь, это поможет в любом случае!

 var ConstrainedValue = if(CurrentSafeValue < 1) 1 else (if(CurrentSafeValue > 18)18 else CurrentSafeValue);

Ответ 8

Для этого вам не нужна внешняя библиотека, попробуйте этот тестовый пример:

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

}