Как найти максимальное значение множества переменных
Мне было интересно, может ли кто-нибудь помочь мне найти максимальное значение набора переменных и назначить их другой переменной. Вот фрагмент моего кода, который может помочь понять, о чем я говорю.
// Ask for quarter values.
System.out.println("What is the value of the first quarter?");
firstQuarter = input.nextDouble();
System.out.println("What is the value of the second quarter?");
secondQuarter = input.nextDouble();
System.out.println("What is the value of the third quarter?");
thirdQuarter = input.nextDouble();
System.out.println("What is the value of the fourth quarter?");
fourthQuarter = input.nextDouble();
//Tell client the maximum value/price of the stock during the year.
//maxStock = This is where I need help
System.out.println("The maximum price of a stock share in the year is: $" + maxStock + ".");
8 ответов
В Java вы можете использовать Math.max следующим образом:
double maxStock = Math.max( firstQuarter, Math.max( secondQuarter, Math.max( thirdQuarter, fourthQuarter ) ) );
Не самый элегантный, но он будет работать.
В качестве альтернативы для более надежного решения определите следующую функцию:
private double findMax(double... vals) {
double max = Double.NEGATIVE_INFINITY;
for (double d : vals) {
if (d > max) max = d;
}
return max;
}
Который вы можете позвонить по:
double maxStock = findMax(firstQuarter, secondQuarter, thirdQuarter, fourthQuarter);
Я считаю, что сейчас в Java 8 самая краткая версия будет выглядеть так:
DoubleStream.of(firstQuarter , secondQuarter , thirdQuarter , fourtQuarter).max();
Один из способов управлять ими всеми
public static <T extends Comparable<T>> T max(T...values) {
if (values.length <= 0)
throw new IllegalArgumentException();
T m = values[0];
for (int i = 1; i < values.length; ++i) {
if (values[i].compareTo(m) > 0)
m = values[i];
}
return m;
}
С примитивными переменными лучший выбор может быть с массивами или коллекциями:
Массивы:
double [ ] data = { firstQuarter , secondQuarter , thirdQuarter , fourtQuarter ) ;
Arrays . sort ( data ) [ 3 ] ;
Коллекции:
List<Double> data = new Arraylist<Double>();
data.add(firstQuarter);
data.add(secondQuarter);
data.add(thirdQuarter);
data.add(foutQuarter);
Collections.sort(data);
data.get(3);
И если вы работаете с объектами, вы можете использовать коллекции с компаратором:
class Quarter {
private double value;
private int order;
// gets and sets
}
И чтобы получить максимальное значение:
List<Quarter> list = new ArrayList<Quarter>();
Quarter fisrt = new Quarter();
first.setValue(firstQuarter);
first.setOrder(1);
list.add(first);
// Do the same with the other values
Collections.sort(list, new Comparator<Quarter>(){
compare(Object o1, Object o2){
return Double.valueOf(o1.getValue()).compareTo(o2.getValue());
}
}
Это может быть более сложным, но если вы работаете с объектами, я думаю, что лучше работать.
double [ ] data = { firstQuarter , secondQuarter , thirdQuarter , fourtQuarter ) ;
Arrays . sort ( data ) [ 3 ] ;
Немного опоздал на вечеринку, но для тех, кто еще просматривает этот вопрос, в Java 8 есть примитивные типы потоков, которые реализуют именно это
Collection<Integer> values = new ArrayList<>();
OptionalInt max = values.stream().mapToInt((x) -> x).max();
mapToInt
является ключевой функцией, которая описывает, как преобразовать входные данные в целочисленный тип. Результирующий поток затем имеет дополнительные агрегаторы и сборщики, специфичные для целочисленных типов, одним из которых является max()
,
Значение результата может быть затем извлечено из OptionalInt
, если операция прошла успешно
Max = firstQuarter;
If(secondQuarter > max)
Max = secondQuarter;
... И так далее
import java.util.Scanner;
public class dmar {
public static void main ( String [] srgs){
Scanner dmar=new Scanner(System.in);{
{
System.out.println ( "inter number of x plz") ;
double x=dmar.nextDouble();
System.out.println ( "inter number of y plz") ;{
double y=dmar.nextDouble();
System.out.println ( "inter number of t plz") ;
double t=dmar.nextDouble();
System.out.println ( "inter number of f plz") ;
double f=dmar.nextDouble();
{
{
if (x>y);
System.out.println("x biger than y");
if (x>t);
System.out.println("x biger than t");
if (x>f);
System.out.println("x biger than f");
if (y>x);
System.out.println("y biger than x");
if (y>t);
System.out.println("y biger than t");
if (y>f);
System.out.println("y biger than f");
if (t>x&t>f&t>y);
System.out.println("t biger than x");
if (t>y);
System.out.println("t biger than y");
if (t>f);
System.out.println("t biger than f");
if (f>x);
System.out.println("f biger than x");
if (f>y);
System.out.println("f biger than y");
if (f>t);
System.out.println("f biger than t");
}