【问题标题】:Does java have a clamp function?java有钳位功能吗?
【发布时间】:2013-05-20 19:11:31
【问题描述】:

假设我有一个value,我通常这样做是为了将它“钳制”到一个范围内,这里是范围[0..1]。也就是说,如果它低于范围开始,则将其增加到范围开始,高于范围结束,将其减小到范围结束。

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

是否有任何内置函数可以限制范围?

【问题讨论】:

  • @LuiggiMendoza HLSL
  • @LuiggiMendoza 还有OpenGL
  • @AdamGent 对我自己的函数进行调整显然很简单,我在问题中就有代码。我宁愿使用内置的,特别是因为它可能会处理所有值数据类型。
  • 我真的不知道你的java专业水平,所以我很难假设你的知识。 c# 使用 Comparable 来处理多种数据类型....猜猜你在 Java 中做了什么:)

标签: java clamp


【解决方案1】:

是否有任何内置函数可以限制范围?

没有。

【讨论】:

  • 很遗憾,由于这个重大疏忽,我不能再向其他开发人员推荐 Java。 (开玩笑,虽然我认为他们应该把它包括在内)
【解决方案2】:

查看了另一个答案中提供的通用钳位方法,值得注意的是,这对原始类型有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));
}

然后为您需要的每个原始类型使用相同的方法重载。

【讨论】:

    【解决方案3】:

    Guava 包括Ints.constrainToRange()(以及其他原语的等效方法)。来自release notes

    添加了constrainToRange([type] value, [type] min, [type] max) 方法,将给定值限制在minmax 值定义的封闭范围内。如果它在范围内,则返回值本身,如果低于范围,则返回 min,如果高于范围,则返回 max

    【讨论】:

    • 对于那些使用 Apache commons lang3 而不是 Guava 的人,有 Range.fit 方法。 Range.between(0.0, 1.0).fit(0.5); // returns 0.5
    • 他们在 3.10 中添加了这个:commons.apache.org/proper/commons-lang/…
    【解决方案4】:

    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)时,此实现将执行三个装箱操作和一个拆箱操作。

    注意:因为它是 the .NET answer 的端口,所以我将其作为社区 wiki 帖子。

    【讨论】:

      【解决方案5】:

      另一个不太漂亮但可能的解决方案是使用三元运算符,它是if-then-else 语句的简写。

      一些例子:

      // value must be between MIN_VALUE and MAX_VALUE
      value = value > MAX_VALUE ? MAX_VALUE : value < MIN_VALUE ? MIN_VALUE : value;
      
      // value must be between 0 and 10
      value = value > 10 ? 10 : value < 0 ? 0 : value;
      

      【讨论】:

      • 我喜欢这种单线。很简洁!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多