【问题标题】:Java - limit number between min and maxJava - 最小值和最大值之间的限制数
【发布时间】:2021-05-23 12:12:16
【问题描述】:

只要数字在限制范围内,我想返回,否则返回限制的最大值或最小值。我可以通过 Math.minMath.max 的组合来做到这一点。

public int limit(int value) {
    return Math.max(0, Math.min(value, 10));
}

我想知道是否存在我忽略的现有 limitrange 函数。
如果第三方库很常见(例如:Commons 或 Guava),欢迎使用它们

【问题讨论】:

  • 这是合适的模式。如果您在很多地方都这样做,只需在帮助类中定义自己的方法即可。
  • 如果这段代码看起来太长,把它包装在你自己的函数中。
  • 我来社区看看有没有这样的功能。只是一个问题.. 我不认为这是一个坏问题?
  • 不错的问题。您展示了到目前为止所做的事情,并特别询问是否有一种方法解决方案。当存在更简单的解决方案时,没有人希望通过重新发明轮子来显得无知。不知道为什么它被否决,但我 +1'ed 以帮助反驳它。
  • @RobertHarvey 我也在想同样的事情。这似乎真的很简单。我想这只是数学家期望在数学库中构建的东西。

标签: java range max min clamp


【解决方案1】:

OP 要求在标准库中实现此功能:

int ensureRange(int value, int min, int max) {
   return Math.min(Math.max(value, min), max);
}

boolean inRange(int value, int min, int max) {
   return (value>= min) && (value<= max);
}

遗憾的是标准数学库缺少这些

【讨论】:

  • 此外,基于 C 的语言缺乏明显的习语 (min &lt;= value &lt;= max),这让新手大吃一惊。
  • 我认为 ensureRange 应该是其他方式:int ensureRange(int value, int min, int max) { return Math.min(Math.max(value, min), max); } 这是一个很好的理由把它放在图书馆里。所以你只能错一次;-)
  • @RensoLohuis Trivial:我希望在 max 之前执行 min。读取顺序!= 执行顺序。
  • @BarryStaes 我不是在谈论执行顺序。你有 Math.min(value, min),这不会帮助你确保范围。如果 value = 3 且 min = 5,Math.min 将返回 3,因此它不会停留在范围内。 Math.max(value, max) 也是如此。所以这个函数不会保证范围。
  • @RensoLohuis 非常感谢!原谅我的脑残,现在修好了。
【解决方案2】:

从版本 21 开始,Guava 包括 Ints.constrainToRange()(以及其他原语的等效方法)。来自release notes

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

由@dimo414 复制自https://stackoverflow.com/a/42968254/122441

不幸的是,这个版本是 2017 年 7 月的最新版本,并且在某些项目中(请参阅 https://stackoverflow.com/a/40691831/122441)Guava 已经破坏了向后兼容性,需要我暂时使用版本 19。我也很震惊,Commons Lang 和 Commons Math 都没有它! :(

【讨论】:

    【解决方案3】:

    如果您使用的是 Android,请使用 MathUtils(在支持库中),它只有一个专门执行此操作的函数,称为钳位。

    此方法接受一个数值并确保它适合给定的 数值范围。如果数量小于要求的最小值 范围,然后将返回范围的最小值。如果 数字高于范围允许的最大值,则 将返回范围的最大值。

    【讨论】:

    • 太棒了。仅作记录,一个用法示例:MathUtils.clamp( value, min, max )
    【解决方案4】:

    我知道这是针对 Java 提出的。在 Android 世界中,使用 Kotlin 很常见 和Java结合。如果某些 Kotlin 用户到达这里(就像我一样),那么他们可以使用 coerceIn 扩展功能:

    Kotlin 代码:

    println(10.coerceIn(1, 100)) // 10
    println(10.coerceIn(1..100)) // 10
    println(0.coerceIn(1, 100)) // 1
    println(500.coerceIn(1, 100)) // 100
    

    阅读更多官方Kotlin Documentation

    【讨论】:

      【解决方案5】:

      Math.max(int a, int b) 函数定义为:

      public static int min(int a, int b) {
          return (a <= b) ? a : b;
      }
      

      因此您可以组合maxmin 函数,如下所示:

      private static int MAX=10;
      private static int MIN=0;
      
      public int limit(int a) {
          return (a > MAX) ? MAX : (a < MIN ? MIN: a );
      }
      

      【讨论】:

        【解决方案6】:

        任何实现Comparable 的类(包括Number 及其子类)的通用方法:

        public static <T extends Comparable<? super T>> T limit(T o, T min, T max){
            if (o.compareTo(min) < 0) return min;
            if (o.compareTo(max) > 0) return max;
            return o;
        }
        

        唯一的要求是所有参数必须属于同一类。它可以防止可能的类型转换丢失。 事实上,将floatdoublelongint 等进行比较是不正确的。例如(double) 0.1 != (float) 0.1

        用法:

        double x = 13.000000001;
        x = limit(x, 12.0, 13.0);
        System.out.println("x = " + x); //x = 13.0
        

        很遗憾,仅通过limit(x, 12.0, 13.0) 直接更改第一个参数是不可能的,因为原始类型是不可变的。

        【讨论】:

          【解决方案7】:

          你不需要外部库,试试这个测试用例:

          public class RandomNumber {
          
              public static void main(String[] Args) {
                  System.out.println("random = " + randomInRange(5,10));
              }
              
              public static double randomInRange(double arg1, double arg2) {
                  double my_number = Math.ceil(Math.random() * (arg1 - arg2) + arg2);
                  return my_number;
              }
          
          }
          

          【讨论】:

            猜你喜欢
            • 2011-08-16
            • 2021-02-19
            • 1970-01-01
            • 2015-03-28
            • 2018-05-30
            • 1970-01-01
            • 2011-02-09
            • 1970-01-01
            • 2013-09-02
            相关资源
            最近更新 更多