2013-05-20 2 views
39

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

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

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

+0

@LuiggiMendoza [HLSL] (http://en.wikipedia.org/wiki/High-level_shader_language) – weston

+0

См http://stackoverflow.com/questions/2683442/where-can-i-find-the -clamp-function-in-net? –

+1

@LuiggiMendoza Также [OpenGL] (http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml) – weston

ответ

37

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

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

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

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

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

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

Тогда просто перегружать с одинаковыми методами для каждого примитивного типа вам требуется.

+0

Второй способ лучше. +1 – Julian

127

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

Номер

+25

Простой и понятный;) +1 –

+6

+10 rep за нажатие клавиши? ;) –

+14

@ ZiyaoWei тоже была некоторая копия и вставка ... –

14

адаптированное из a .NET answer:

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, примитивные типы не допускаются в воспроизведенных, что означает, что они должны быть в штучной упаковке/без упаковки. При работе с примитивными типами, такими как int и double, эта реализация будет выполнять три операции с ящиками и одну операцию удаления.

Примечание: так как это порт the .NET answer, я сделал это сообществом wiki-сообщения.

5

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

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

Смежные вопросы