【问题标题】:Find the max of 3 numbers in Java with different data types在 Java 中查找具有不同数据类型的最大 3 个数字
【发布时间】:2011-02-13 03:14:37
【问题描述】:

假设我有以下三个常量:

final static int MY_INT1 = 25;
final static int MY_INT2 = -10;
final static double MY_DOUBLE1 = 15.5;

我想取其中三个并使用Math.max() 来查找三个中的最大值,但如果我传入两个以上的值,那么它会给我一个错误。例如:

// this gives me an error
double maxOfNums = Math.max(MY_INT1, MY_INT2, MY_DOUBLE2);

请让我知道我做错了什么。

【问题讨论】:

    标签: java math max


    【解决方案1】:

    Math.max 只接受两个参数。如果您想要最多三个,请使用Math.max(MY_INT1, Math.max(MY_INT2, MY_DOUBLE2))

    【讨论】:

    • 当涉及n个值时,一定有更好的方法。
    • @mlissner 是的,使用循环和变量max,检查每个变量是否大于max,如果是:将max 设置为该变量。假设你的 n 值当然是在一个数组中。
    【解决方案2】:

    如果可能,请使用 Apache Commons Lang 中的 NumberUtils - 那里有很多很棒的实用程序。

    https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/math/NumberUtils.html#max(int[])

    NumberUtils.max(int[])
    

    【讨论】:

    • 在问题中混合了 int 和 double,我认为它不会起作用
    【解决方案3】:

    你可以用这个:

     Collections.max(Arrays.asList(1,2,3,4));
    

    或者创建一个函数

    public static int max(Integer... vals) {
        return Collections.max(Arrays.asList(vals)); 
    }
    

    【讨论】:

    • 操作要求多种原始类型.. int 和 double。这并没有解决这个问题。但我确实喜欢这个前提。
    【解决方案4】:

    Math.max 只接受两个参数,不多也不少。

    已发布答案的另一种不同解决方案是使用DoubleStream.of

    double max = DoubleStream.of(firstValue, secondValue, thirdValue)
                             .max()
                             .getAsDouble();
    

    【讨论】:

      【解决方案5】:

      不使用第三方库,多次调用同一个方法或创建一个数组,你可以像这样找到任意数量的双精度数的最大值

      public static double max(double... n) {
          int i = 0;
          double max = n[i];
      
          while (++i < n.length)
              if (n[i] > max)
                  max = n[i];
      
          return max;
      }
      

      在您的示例中,max 可以这样使用

      final static int MY_INT1 = 25;
      final static int MY_INT2 = -10;
      final static double MY_DOUBLE1 = 15.5;
      
      public static void main(String[] args) {
          double maxOfNums = max(MY_INT1, MY_INT2, MY_DOUBLE1);
      }
      

      【讨论】:

      • 我认为问题在于使用 Math.max 而不是重新创建 max 函数。
      【解决方案6】:

      Java 8 方式。适用于多个参数:

      Stream.of(first, second, third).max(Integer::compareTo).get()
      

      【讨论】:

      • 还不如使用DoubleStream来比较双打。
      【解决方案7】:

      我有一个很简单的想法:

       int smallest = Math.min(a, Math.min(b, Math.min(c, d)));
      

      当然,如果你有1000 numbers,它就无法使用,但如果你有34 号码,它既简单又快速。

      问候, 诺伯特

      【讨论】:

      • 我很确定问题是关于最大数量...而不是最小数量;)
      【解决方案8】:

      如前所述,Math.max() 只接受两个参数。它与您当前的语法不完全兼容,但您可以尝试 Collections.max()。

      如果你不喜欢这样,你可以随时为它创建自己的方法......

      public class test {
          final static int MY_INT1 = 25;
          final static int MY_INT2 = -10;
          final static double MY_DOUBLE1 = 15.5;
      
          public static void main(String args[]) {
              double maxOfNums = multiMax(MY_INT1, MY_INT2, MY_DOUBLE1);
          }
      
          public static Object multiMax(Object... values) {
              Object returnValue = null;
              for (Object value : values)
                  returnValue = (returnValue != null) ? ((((value instanceof Integer) ? (Integer) value
                          : (value instanceof Double) ? (Double) value
                                  : (Float) value) > ((returnValue instanceof Integer) ? (Integer) returnValue
                          : (returnValue instanceof Double) ? (Double) returnValue
                                  : (Float) returnValue)) ? value : returnValue)
                          : value;
              return returnValue;
          }
      }
      

      这将接受任意数量的混合数字参数(整数、双精度和浮点数),但返回值是一个对象,因此您必须将其转换为整数、双精度或浮点数。

      它也可能引发错误,因为没有“MY_DOUBLE2”之类的东西。

      【讨论】:

      • 现在我自己只是个菜鸟,如果有人能帮我清理一下,将不胜感激......
      • 此方法会导致不必要的装箱/拆箱,并包含可避免的类型检查和强制转换。最好有几个具有具体类型的重载方法。
      【解决方案9】:
      int first = 3;  
      int mid = 4; 
      int last = 6;
      
      //checks for the largest number using the Math.max(a,b) method
      //for the second argument (b) you just use the same method to check which  //value is greater between the second and the third
      int largest = Math.max(first, Math.max(last, mid));
      

      【讨论】:

        【解决方案10】:

        你可以这样做:

        public static void main(String[] args) {
        
            int x=2 , y=7, z=14;
            int max1= Math.max(x,y);
        
            System.out.println("Max value is: "+ Math.max(max1, z)); 
        }  
        

        【讨论】:

          【解决方案11】:

          如果你想做一个简单的,会是这样的

          // Fig. 6.3: MaximumFinder.java
          // Programmer-declared method maximum with three double parameters.
          import java.util.Scanner;
          
          public class MaximumFinder
          {
            // obtain three floating-point values and locate the maximum value
            public static void main(String[] args)
            {
              // create Scanner for input from command window
              Scanner input = new Scanner(System.in);
          
              // prompt for and input three floating-point values
              System.out.print(
                "Enter three floating-point values separated by spaces: ");
              double number1 = input.nextDouble(); // read first double
              double number2 = input.nextDouble(); // read second double
              double number3 = input.nextDouble(); // read third double
          
              // determine the maximum value
              double result = maximum(number1, number2, number3);
          
              // display maximum value
              System.out.println("Maximum is: " + result);
            }
          
            // returns the maximum of its three double parameters          
            public static double maximum(double x, double y, double z)     
            {                                                              
              double maximumValue = x; // assume x is the largest to start
          
              // determine whether y is greater than maximumValue         
              if (y > maximumValue)                                       
                maximumValue = y;                                        
          
              // determine whether z is greater than maximumValue         
              if (z > maximumValue)                                       
                maximumValue = z;                                        
          
              return maximumValue;                                        
            }                                                              
          } // end class MaximumFinder
          

          输出会是这样的

          Enter three floating-point values separated by spaces: 9.35 2.74 5.1
          Maximum is: 9.35
          

          参考Java™ How To Program (Early Objects), Tenth Edition

          【讨论】:

            【解决方案12】:

            没有方法的简单方法

            int x = 1, y = 2, z = 3;
            
            int biggest = x;
            if (y > biggest) {
                biggest = y;
            }
            if (z > biggest) {
                biggest = z;
            }
            System.out.println(biggest);
            //    System.out.println(Math.max(Math.max(x,y),z));
            

            【讨论】:

              猜你喜欢
              • 2017-04-12
              • 1970-01-01
              • 2022-10-14
              • 2014-08-05
              • 2013-12-31
              • 2018-10-05
              • 1970-01-01
              • 2020-04-03
              • 1970-01-01
              相关资源
              最近更新 更多