2016-11-28 2 views
0

Я хочу узнать максимальное значение массива, который содержит числа от 0 до 6. Но число 6 должно быть исключено. В моей логике 5 является наибольшим числом, так что я должен разобраться в 6.Максимальное значение за исключением одного номера

for (int i = 0; i < requirements.length; i++) { 
    for (int k = i + 1; k < requirements.length; k++) { 
     if(requirements[i] < requirements[k]) 
       && requirements[k] != 6) { 
      highest = requirements[k]; 
     } else { 
      if(requirements[i] != 6) { 
       highestAsilLevel = requirements[i]; 
      } 
     } 
    } 
} 

Я получил это далеко, но это не будет работать для любого случая.

+0

Можете ли вы привести пример, так что это более ясно. – FallAndLearn

+0

Вы выделяете 6, потому что интервал составляет от 0 до 6 (исключается) или потому, что в этом случае 6 больше, и вы хотите, чтобы «секунды больше»? – AxelH

ответ

3

Почему две петли? Только один должен быть достаточно:

Integer max = null; 
for (int i = 0; i < requirements.length; i++) { 
    Integer currentValue = requirements[i]; 
    if (currentValue!=6 && (max==null || currentValue>max)){ 
      max = currentValue; 
    } 
} 
return max; 
+0

Осторожно, '&&' имеет приоритет над '||', поэтому у вас будет NPE, если первое значение массива равно 6 (см. [Здесь] (https://ideone.com/aOCVzc)). Вы хотите добавить круглые скобки вокруг этого 'max == null || CurrentValue> max'. Хороший ответ в противном случае, мне нравится, что вы использовали 'Integer', так что массив, пустой или полный 6, вернет' null'. – Aaron

+0

Вы правы. Я должен поставить условие «ИЛИ» между круглыми скобками, чтобы избежать этого. Спасибо. Done – davidxxx

0

Я думаю, что вы хотите, второе наибольшее число в массиве .. вы можете сделать следующее

public class TwoMaxNumbers { 
public static void main(String a[]){ 
    int requirements[] = {5,34,78,2,45,1,99,23}; 
    int maxOne = 0; 
    int maxTwo = 0; 
    for(int n:requirements){ 
     if(maxOne < n){ 
      maxTwo = maxOne; 
      maxOne =n; 
     } else if(maxTwo < n){ 
      maxTwo = n; 
     } 
    } 
    System.out.println("Second Max Number: "+maxTwo); 
} 
} 

, если вы хотите избежать только номер 6 вы можете сделать это

int max = null; 
for (int i = 0; i < requirements.length; i++) { 
int max1 = requirements[i]; 
if ((max1!=6) && (max==null || max1>max)){ 
     max = max1; 
    } 
} 
return max; 
+0

Глядя на код OP, похоже, он не пытается получить второе по величине значение, а скорее самое высокое значение, которое не равно 6. – Aaron

+0

ему нужно быть более ясным, тогда –

+0

Не знаю, я прыгнул на том же как вы в начале, вероятно, из-за названия и потому что это более распространенная проблема, но описание делает его довольно понятным, он просто хочет избежать 6. – Aaron

2

1.) Сортировка ваш массив

2.) начать цикл с конца

3) сравнить число, если это не 6, то вы получили свой номер

int num=-1; 
Arrays.sort(array); 
for(int i=array.length-1;i>=0;i--){ 
    if(array[i]!=6){ 
     num = array[i]; 
     break; 
    } 
} 

if(num!=-1){ 
    // you found your value 
}else{ 
// all 6 , no expected value found 
} 

Примечание: Для будущих читателей Array.sort гарантия п * журнала (п) сложность, которая значительно эффективнее, особенно когда размер массива не огромный Read this и this beautiful article для получения более подробной информации.

+0

Это может быть неудачно, если массив содержит только 6. –

+0

@SujithMohan, тогда просто нет другого элемента, который вы ищете, используйте значение по умолчанию как '-1' –

+0

@PavneetSingh, какой смысл сортировать? Сложность будет меньше, если вы просто используете свой цикл без сортировки (и разрыва). – AxelH

0

Вот ваш анс:

public class Test { 
    public static void main(String[] args) { 

     int num[] = { 6, 1, 2, 3, 4, 5 }; 
     int max = 0; 
     for (int i = 0; i < num.length; i++) { 
      if (max < num[i] && num[i] != 6) { 
       max = num[i]; 
      } 
     } 
     System.out.println(max); 

    } 

} 
+0

Хотя это работает в этом конкретном случае, потому что диапазон чисел [0-6] Я бы посоветовал не инициализировать 'max' до 0: если в будущем массив может содержать отрицательные числа, этот код будет терпеть неудачу при обработке массивов, содержащих только отрицательные значения. Наилучшей практикой было бы инициализировать 'max' до первого значения в массиве и итерации над остальными, второе лучше было бы инициализировать' max' до 'Integer.MIN_VALUE'.В этом втором случае (и в вашем случае тоже) вы должны знать, что максимальный размер пустого массива будет именно этим значением (что может быть или не очень хорошо) – Aaron

+0

В чем разница с ** davidxxx ** Ответ ? За исключением того, что его воля работает с полным диапазоном Integer. – AxelH

+0

@AxelH Спасибо! –

0
int requirements[] = { 6, 1, 2, 3, 4, 5 }; 
    int max = Arrays.stream(requirements).filter(i -> i!=6).max().getAsInt(); 
    System.out.println(max); 
Смежные вопросы