2014-02-21 6 views
-1
int playerOne = 4; 
int playerTwo = 8; 
int playerThree = 2; 
int playerFour = 8; 

public static int max(int p1, int p2, int p3, int p4) { 
    if(p1 > p2 && p1 > p3 && p1 > p4){ 
     return p1; 
    } else if (p2 > p1 && p2 > p3 && p2 > p4) { 
     return p2; 
    } else if ... 


} 

Мне интересно, это лучший способ воссоздать вышеприведенную функцию с меньшей повторяемостью.Как найти max из списка целых чисел

Спасибо.

+1

, вероятно, лучшим вопрос для проверки коды. – Dom

+0

Извините, где мне нужно переместить его или просто изменить тег. – jackdh

+0

Интересно, есть ли способ получить Hotspot для генерации SIMD-инструкций для обобщенного случая. –

ответ

6
public static int max(int[] integers) { 
    int max = Integer.MIN_VALUE; 
    for (int e : integers) max = Math.max(max, e); 
    return max; 
} 

Теперь для реализации, которая может также возвращать информацию о имени переменной:

//Returns the array index of the maximum integer 
public static int max(int[] integers) { 
    int max = Integer.MIN_VALUE; 
    int retVal = -1; 
    if (integers == null) return retVal; //needs to handle this case too 
    for (int i = 0; i < integers.length; i++) { 
     max = Math.max(max, integers[i]); 
     if (integers[i] == max) retVal = i; 
    } 
    return retVal; 
} 

Эти реализации также имеют преимущество быть в состоянии обрабатывать массивы любого размера, а не только 4.

+1

@ La-comadreja Вы должны инициализировать 'max' одним из значений из' integers' вместо 'Integer.MIN_VALUE'. 'Integer.MIN_VALUE' даже не существует в вашем массиве ввода, поэтому, если ваш входной массив пуст, он вернет' Integer.MIN_VALUE', что неверно. –

+0

@Yatendra, а что, если целые числа пустые или равно null? 2-я реализация изменилась для обработки нулевого значения. Причина печати Integer.MIN_VALUE (или retVal == -1) заключается в том, что он становится явным признаком того, что массив не имеет значений. –

+0

@ Yatendra, вторая реализация возвращает индекс (см. Комментарий выше метода), а индексы не могут быть отрицательными в Java. –

1
public static int max(int[] integers) { 
    int max = integers[0]; 
    for (int i = 1; i < integers.length; i++) 
     max = Math.max(max, integers[i]); 
    return max; 
} 
+1

@ У La-comadreja есть лучшее решение, итераторы - это намного больше XXI века :-) – zmo

+1

За исключением риска пустого массива, это имеет смысл – Leo

+1

@zmo Существует причина, почему не используются итераторы. Я инициализирую значение 'max' с первым целым числом в массиве. В идеале это должно происходить вместо инициализации 'max' с некоторым значением, которое даже не существует в вашем входном массиве. –

0

только для удовольствия, я даю рекурсивный способ, это не лучше, чем другие варианты, но это весело ;-)

public static int get_max(int[] integers) { 
    switch (integers.length) { 
     case 0: 
      throw new IllegalArgumentException(); 
     case 1: 
      return integers[0]; 
     case 2: 
      return Math.max(integers[0],integers[1]); 
     default: 
      return Math.max(integers[0], get_max(Arrays.copyOfRange(integers, 1, integers.length-1)); 
    } 
} 

afaict он должен работать, но он не эффективен с точки зрения памяти, потому что он копирует массив (меньше одного значения) при каждой рекурсии и ест память для каждого вызова функции для каждой рекурсии.

<3

2

С Java 8 это будет:

private int max(int... ints) { 
    if (ints.length == 0) { 
     throw new IllegalArgumentException(); 
    } 
    return Arrays.stream(ints).max().getAsInt(); 
} 

Объяснение ступенчато:

  1. Убедитесь, что ints.length > 0.
  2. Создать IntStream.
  3. Получить максимальное значение с помощью max() на IntStream.
  4. Получите int и верните его, из OptionalInt, который возвращает max().

Надеюсь, это поможет в будущем.

+0

вот так, ты заставил меня узнать что-то новое сегодня вечером, спасибо! – zmo

1

Если вы используете класс обертки Integer, вы могли бы сделать:

public static int max(Integer... values){ 
    return Collections.max(Arrays.asList(values)); 
} 
Смежные вопросы