假設我有一個value
,我通常會將它「夾」到一個範圍,這裏的範圍是[0..1]
。也就是說,如果它低於範圍起點,將其增加到範圍起點,高於範圍終點,將其減小到範圍終點。java是否具有鉗位功能?
clampedValue = Math.max(0, Math.min(1, value));
是否有任何內置的功能鉗位範圍?
假設我有一個value
,我通常會將它「夾」到一個範圍,這裏的範圍是[0..1]
。也就是說,如果它低於範圍起點,將其增加到範圍起點,高於範圍終點,將其減小到範圍終點。java是否具有鉗位功能?
clampedValue = Math.max(0, Math.min(1, value));
是否有任何內置的功能鉗位範圍?
查看了另一個答案中提供的通用鉗位方法後,值得注意的是,這對原始類型有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));
}
然後,只需與你要求每個原始類型相同的方法重載。
第二種方法是最好的。 +1 – Julian
是否有任何內置的功能鉗位範圍?
號
簡單明瞭;)+1 –
+10代表每個擊鍵? ;) –
@ZiyaoWei還有一些複製和粘貼...... –
從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
)時,此實現將執行三個框操作和一個unbox操作。
注意:因爲它是the .NET answer的一個端口,所以我將其製作爲社區wiki文章。
從版本21起,Guava包括Ints.constrainToRange()
(以及其他基元的等效方法)。從release notes:
加入
constrainToRange([type] value, [type] min, [type] max)
方法,其限制了給定值,以由所述min
和max
值所定義的閉合的範圍。如果它在範圍內,則返回值本身,min
如果在範圍以下,則返回值;如果超出範圍,則返回max
。
@LuiggiMendoza [HLSL](http://en.wikipedia.org/wiki/High-level_shader_language) – weston
參見http://stackoverflow.com/questions/2683442/where-can-i-find-the -clamp-function-in-net? –
@LuiggiMendoza同樣[OpenGL的(http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml) – weston