2013-05-20 79 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代表每個擊鍵? ;) –

+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,原始類型沒有在允許泛型,這意味着它們必須被裝箱/裝箱。使用原始類型(例如intdouble)時,此實現將執行三個框操作和一個unbox操作。

注意:因爲它是the .NET answer的一個端口,所以我將其製作爲社區wiki文章。

5

從版本21起,Guava包括Ints.constrainToRange()(以及其他基元的等效方法)。從release notes

加入constrainToRange([type] value, [type] min, [type] max)方法,其限制了給定值,以由所述minmax值所定義的閉合的範圍。如果它在範圍內,則返回值本身,min如果在範圍以下,則返回值;如果超出範圍,則返回max

相關問題