Больше результатов, чем ожидалось Java - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь создать метод, который возвращает второе большее число массива. Когда я возвращаю значение, в консоли появляется 2 или более значений. Я не могу понять, почему это происходит. Может кто-нибудь помочь мне понять это, пожалуйста? Я сделал метод для поиска большего значения, чтобы использовать его на том, который возвращает второе большее значение.

public class ThirdMax {

    public static int maxNum (int[] array) { //Returns the bigger value of the array.

        int aux = 0;    //Variable to store the bigger value found and compare it with the rest.
        for (int i = 0; i < array.length; i++) {

            if(array[i] > aux) {    //If the actual value is bigger than the aux
                aux = array[i];     //override the aux value with actual value.
            }
        }
        System.out.println(aux);
        return aux;
    }

    public static int secondMax(int[] array) {  //Returns the second bigger value on the array.
        int valorMax = maxNum(array);   //Store the bigger value on a variable so we can use it later.
        int valorMax2 = 0;              //Variable to store the result.
        int[] auxArray = new int [array.length];                                
        for (int i = 0; i < array.length; i++) {
            if(array[i] == valorMax) {  //When we get to the valorMax, we replace it in the array with a 0.
                array[i] = 0;
                } else {
                    auxArray[i] = array[i];
                }

            valorMax2 = maxNum(auxArray); //Search again the bigger value after the previous one is replaced by 0.
            }
        return valorMax2;
        }

}

Заранее спасибо за ваше время!

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Потому что вы положили функцию получения второго максимума в неправильном месте.

public static int secondMax(int[] array) {  
    int valorMax = maxNum(array);   
    int valorMax2 = 0;             
    int[] auxArray = new int [array.length];                                
    for (int i = 0; i < array.length; i++) {
        if(array[i] == valorMax) { 
            array[i] = 0;
            } else {
                auxArray[i] = array[i];
            }
        }
    valorMax2 = maxNum(auxArray); // this should be out of loop
    return valorMax2;
    }

}

0 голосов
/ 08 мая 2018

Поскольку вы устанавливаете наибольшее число в 0, вам действительно не нужен auxArray. Вам также не нужен второй valorMax. Возможно, вы захотите изменить свой код следующим образом.

public static int secondMax(int[] array) {  
    int valorMax = maxNum(array);   
    for (int i = 0; i < array.length; i++) {
        if(array[i] == valorMax) { 
            array[i] = 0;
        }
    }
    return maxNum(array); // just return the result of maxNum(array)
}

обязательно удалите оператор печати из maxNum, если вы не хотите, чтобы ваша программа печатала 2 числа на консоль.

0 голосов
/ 08 мая 2018

Вы звоните maxNum(auxArray); несколько раз. Каждый из них печатает максимальное значение.

Следовательно, вы получили несколько результатов.

Чтобы немедленно решить проблему, удалите отпечаток System.out.println(aux); в вашей функции.

И сделайте только одну функцию печати прямо перед возвратом

System.out.println(valorMax2);
return valorMax2;

Но ваш код выглядит не очень хорошо. Нужно многократное улучшение.

Чтобы найти второе по величине число, вам нужно выполнить цикл только один раз так:

public static int secondMax(int[] array) {
   int max = Integer.MIN_VALUE; // Max value
   int secondMax = Integer.MIN_VALUE; // Second max value, its our result

   for (int i = 0; i < array.length; i++) {
      if (array[i] > max) {
        secondMax = max;
        max = array[i];
      } else if (array[i] > secondMax) {
        secondMax = array[i];
      }
   }
   return secondMax;
}

Это выглядит нормально, но не может быть расширен для поиска n-го максимального числа, потому что наши условия будут очень сложными. Затем вы пытаетесь найти максимальное количество раз за раз:

// Return max number in array which is lower than ceilValue
// Return Integer.MIN_VALUE if no such value found
public static int maxValueBelow(int[] array, int ceilValue) {
   int max = Integer.MIN_VALUE;
   for (int i = 0; i<array.length; i++) {
       if (array[i] < ceilValue && array[i] > max) {
         max = array[i];
       }
   }
   return max;
}

public static int findNthValue(int[] array) {
  int maxValue = maxValueBelow(array, Integer.MAX_VALUE);
  int secondMaxValue = maxValueBelow(array, maxValue);
  int thirdMaxValue = maxValueBelow(array, secondMaxValue);
  // You can improve this function by give it's a second parameter `n`, and use for loop to find the `n-th` max value.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...