Java - предельное число между min и max
Я хочу вернуть число до тех пор, пока оно попадает в лимит, иначе верните максимальное или минимальное значение предела. Я могу сделать это с помощью комбинации Math.min
и Math.max
.
public int limit(int value) {
return Math.max(0, Math.min(value, 10));
}
Мне интересно, есть ли существующая функция limit
или range
, которую я пропускаю.
Сторонние библиотеки приветствуются, если они довольно распространены (например: Commons или Guava).
Ответы
Ответ 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;
}
}