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

У java есть функция зажима?

Предположим, что у меня есть value, я обычно делаю это, чтобы "закрепить" его в диапазоне, здесь диапазон [0..1]. То есть, если он находится ниже начала диапазона, увеличьте его до начала диапазона, он превысит конец диапазона, уменьшите его до конца диапазона.

clampedValue = Math.max(0, Math.min(1, value));

Есть ли встроенная функция для зажима в диапазоне?

4b9b3361

Ответ 1

Посмотрев на общий метод зажима, предложенный в другом ответе, стоит отметить, что у него бокс/распаковка для примитивных типов.

public static <T extends Comparable<T>> T clamp(T val, T min, T max) {...}

float clampedValue = clamp(value, 0f, 1f);

Это будет использовать класс оболочки Float, в результате чего будут выполняться 3 полевые операции, по одному для каждого параметра и 1 операция unbox для возвращаемого типа.

Чтобы этого избежать, я просто буду писать длинную руку или использовать не-общую функцию для типа, который вы хотите:

public static float clamp(float val, float min, float max) {
    return Math.max(min, Math.min(max, val));
}

Затем просто перегружайте одинаковые методы для каждого примитивного типа, который вам нужен.

Ответ 2

Есть ли встроенная функция для зажима в диапазоне?

Нет.

Ответ 3

Портировано из .NET-ответа:

public static <T extends Comparable<T>> T clamp(T val, T min, T max) {
    if (val.compareTo(min) < 0) return min;
    else if (val.compareTo(max) > 0) return max;
    else return val;
}

Предостережение: В отличие от .NET, примитивные типы не допускаются в generics, а это значит, что они должны быть в коробке/распакованном. При работе с примитивными типами, такими как int и double, в этой реализации будут выполняться три операции с полем и одна операция unbox.

Примечание: с его порта ответа .NET я сделал это публикацией сообщества wiki.

Ответ 4

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

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