web-dev-qa-db-ja.com

異なるデータ型でJavaで最大3つの数字を見つける

次の3つの定数があるとします。

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

それらの3つを取り、Math.max()を使用して3つの最大値を見つけますが、2つ以上の値を渡すとエラーになります。例えば:

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

私が間違っていることを教えてください。

33
Drew Bartlett

_Math.max_は2つの引数のみを取ります。最大3つが必要な場合は、Math.max(MY_INT1, Math.max(MY_INT2, MY_DOUBLE2))を使用します。

77

可能であれば、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[])
14
eugene

これを使用できます:

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

または関数を作成する

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

サードパーティのライブラリを使用したり、同じメソッドを複数回呼び出したり、配列を作成したりせずに、次のように任意の倍数の最大値を見つけることができます

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);
}
8

Math.maxは2つの引数のみを取り、それ以上でもそれ以下でもありません。

既に投稿された回答に対する別の異なるソリューションは、 DoubleStream.of

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

Java 8の方法。複数のパラメーターに対応:

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

私は非常にシンプルなアイデアを持っています:

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

もちろん、1000 numbers、それは使用できませんが、3または4数字、その簡単かつ高速。

よろしく、ノーバート

3
user5430588

前述のように、Math.max()は2つの引数のみを取ります。現在の構文と完全に互換性はありませんが、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」などは存在しないため、エラーがスローされることもあります。

1
Samuel Willems
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));
1
kirshiyin

シンプルにしたい場合は、このようになります

// 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(初期オブジェクト)、第10版

0