2013-05-20 24 views
39

Załóżmy, że mam value, zwykle robię to, aby "zacisnąć" go do zakresu, tutaj zakres [0..1]. To znaczy, jeśli jest poniżej początku zakresu, zwiększ ją do początku zakresu, a powyżej zakresu, zmniejsz ją do końca zakresu.Czy java ma funkcję clampowania?

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

Czy jest jakaś wbudowana funkcja do mocowania do zakresu?

+0

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

+0

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

+1

@LuiggiMendoza Również [OpenGL] (http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml) – weston

Odpowiedz

37

Po zapoznaniu się z ogólną metodą zacisku zaproponowaną w innej odpowiedzi, warto zauważyć, że ma ona względy typowe dla wersji boxing/unboxing.

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

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

zostanie użyte klasę Float osłony, w wyniku operacji 3 nadwozia, po jednej dla każdego z parametrów, i 1 operacji unbox na zwróconej typu.

Aby tego uniknąć, chciałbym po prostu przykleić do pisania długą rękę lub skorzystać z funkcji nierodzajową dla typu chcesz:

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

Po prostu przeciążać z identycznymi metodami każdym prymitywnego rodzaju potrzebujesz.

+0

Druga metoda jest najlepsza. +1 – Julian

127

Czy jest jakaś wbudowana funkcja do mocowania do zakresu?

nr

+25

Prosty i jasny;) +1 –

+6

+10 powtó na jeden skrót klawiszowy? ;) –

+14

@ZiyaoWei było trochę zamieszania ... –

14

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

Uwaga: przeciwieństwie .NET, prymitywne typy nie są dozwolone w generycznych, co oznacza, że ​​muszą być one zapakowane/rozpakowanych. Podczas pracy z typami pierwotnymi, takimi jak int i double, ta implementacja wykona trzy operacje skrzynki i jedną operację unbox.

Uwaga: ponieważ jest to port the .NET answer, zrobiłem ten post wiki społeczności.

5

Od wersji 21, Guava obejmuje Ints.constrainToRange() (i równoważne metody dla innych elementów pierwotnych). Z release notes:

dodano constrainToRange([type] value, [type] min, [type] max) sposobów, które ograniczają daną wartość w przedziale zamkniętym określonym przez wartości min i max. Zwracają wartość, jeśli jest ona w zakresie, min, jeśli jest poniżej zakresu i max, jeśli jest powyżej zakresu.

Powiązane problemy