Найдите максимум 3 числа в Java с разными типами данных

Скажем, у меня есть следующие три константы:

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

Пожалуйста, дайте мне знать, что я делаю неправильно.


person Drew Bartlett    schedule 13.02.2011    source источник


Ответы (11)


Math.max принимает только два аргумента. Если вы хотите максимум три, используйте Math.max(MY_INT1, Math.max(MY_INT2, MY_DOUBLE2)).

person Jeremiah Willcock    schedule 13.02.2011
comment
Должен быть лучший способ, когда задействовано n значений. - person mlissner; 17.04.2013
comment
@mlissner Да, используйте цикл и переменную max, проверьте для каждой переменной, больше ли они, чем max, если да: установите max для этой переменной. Предполагая, что ваши значения n находятся в массиве, конечно. - person Jochem Kuijpers; 20.09.2013

Если возможно, используйте NumberUtils в Apache Commons Lang — там много отличных утилит.

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

NumberUtils.max(int[])
person eugene    schedule 26.04.2012
comment
В вопросе есть смесь int и double, я не думаю, что это сработает - person Enrico Giurin; 01.07.2018

вы можете использовать это:

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

или создайте функцию

public static int max(Integer... vals) {
    return Collections.max(Arrays.asList(vals)); 
}
person shifu    schedule 03.07.2017
comment
op запросил несколько примитивных типов.. int и double. Это не относится к этому. Но мне нравится предпосылка этого. - person JGFMK; 10.06.2020

Math.max принимает только два аргумента, не больше и не меньше.

Другим другим решением для уже опубликованных ответов будет использование DoubleStream.of:

double max = DoubleStream.of(firstValue, secondValue, thirdValue)
                         .max()
                         .getAsDouble();
person Ousmane D.    schedule 17.03.2018

Без использования сторонних библиотек, вызывая один и тот же метод более одного раза или создавая массив, вы можете найти максимум произвольного числа двойников, например так

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);
}
person Mr Bean    schedule 17.03.2015
comment
Я считаю, что вопрос заключается в использовании Math.max, а не в воссоздании функции max. - person Francis Colas; 18.03.2015

Java 8 способ. Работает для нескольких параметров:

Stream.of(first, second, third).max(Integer::compareTo).get()
person Den Roman    schedule 13.04.2017
comment
С таким же успехом можно использовать DoubleStream для сравнения двойников. - person jaco0646; 08.11.2017

У меня есть очень простая идея:

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

Конечно, если у вас есть 1000 numbers, это непригодно, но если у вас есть номера 3 или 4, это легко и быстро.

С уважением, Норберт

person user5430588    schedule 10.10.2015
comment
Я почти уверен, что вопрос был о максимальном количестве... а не о минимальном;) - person Edd; 16.06.2016

Как упоминалось ранее, 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;
    }
}

Это будет принимать любое количество смешанных числовых аргументов (Integer, Double и Float), но возвращаемое значение является объектом, поэтому вам придется привести его к Integer, Double или Float.

Это также может вызвать ошибку, поскольку не существует такой вещи, как «MY_DOUBLE2».

person Samuel Willems    schedule 04.06.2013
comment
Теперь я сам просто нуб, если кто-нибудь может помочь мне очистить это, это будет очень признательно... - person Samuel Willems; 05.06.2013
comment
Этот метод приводит к ненужной упаковке/распаковке и содержит проверки типов и приведения типов, которых можно избежать. Лучше иметь несколько перегруженных методов с конкретным типом. - person deamon; 23.08.2018

Вы можете сделать так:

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)); 
}  
person user12949057    schedule 23.02.2020

если вы хотите сделать просто, это будет так

// 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 Издание

person Basheer AL-MOMANI    schedule 21.02.2017

Простой способ без методов

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));
person Hayk Ohanyan    schedule 15.05.2020