Java - Нахождение минимального числа - PullRequest
1 голос
/ 06 декабря 2011

Следующий код должен прочитать некоторые числа и поставить «<== Наименьшее число» рядом с наименьшим. В чем моя проблема здесь? Кажется, это не работает! Каждый раз, когда кажется, что назначается неправильный номер как минимум. </p>

import java.util.ArrayList;
import java.util.Scanner;

public class arrayex1 {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        ArrayList<Integer> numbers = new ArrayList<Integer>();

        System.out.println("Enter numbers: ");

        for (int i = 0; i < 10; i++) {

            int num = input.nextInt();

            numbers.add(num);

        }

        for (int i = 0; i < numbers.size(); i++) {


            if (numbers.get(findMin(numbers)) == i) { // If the 'smallest' index value is equal to i.

                System.out.println(numbers.get(i) + " <== Smallest number");

            } else {

                System.out.println(numbers.get(i));

            }

        }

    }

    public static int findMin(ArrayList<Integer> n) {

        int min = 0; // Get value at index position 0 as the current smallest.

        for (int i = 0; i < n.size(); i++) {

            if (n.get(i) < min) {

                min = i;

            }

        } 

        return min;

    }

}

Ответы [ 7 ]

1 голос
/ 06 декабря 2011

Переменная min в findMin() фактически является индексом минимального числа в n. Изменить это:

if (n.get(i) < min)

до:

if (n.get(i) < n.get(min))

Сохраните возвращаемое значение findMin() перед входом в цикл for:

final int min_idx = findMin(numbers);
for (int i = 0; i < numbers.size(); i++) {
    if (min_idx == i) { // If the 'smallest' index value is equal to i.
        System.out.println(numbers.get(i) + " <== Smallest number");
    } else {
        System.out.println(numbers.get(i));
    }
}
1 голос
/ 06 декабря 2011
if (numbers.get(findMin(numbers)) == i) { // If the 'smallest' index value is equal to i.

Вызывая numbers.get(), вы получаете значение слота на i.

0 голосов
/ 06 декабря 2011

Просто измените следующий код, и он будет работать наверняка.

**if (numbers.get(findMin(numbers)) == numbers.get(i))** 
{ // If the 'smallest' index value is equal to i.               
   System.out.println(numbers.get(i) + " <== Smallest number");              
}

and 

public static int findMin(ArrayList<Integer> n) 
{         
  int min = 0; // Get value at index position 0 as the current smallest.          
  for (int i = 0; i < n.size(); i++) 
  {             
    **if (n.get(i) < n.get(min))**
    {                  
      min = i;              
    }         
  }          
  return min;     
} 
0 голосов
/ 06 декабря 2011
if (n.get(i) < min) 

должно быть:

if (n.get(i) < n.get(min))

Посмотреть

0 голосов
/ 06 декабря 2011

Вот улучшенный рабочий образец (хотя без входов сканера для простого тестирования):

public static void main(String[] args){
    ArrayList<Integer> numbers = new ArrayList<Integer>();
    numbers.add(5);
    numbers.add(7);
    numbers.add(3);

    int minIndex = findMin(numbers);
    for(int i = 0; i < numbers.size(); i++){
        if(minIndex == i){ // If the 'smallest' index value is equal to i.
            System.out.println(numbers.get(i) + " <== Smallest number");
        }else{
            System.out.println(numbers.get(i));
        }
    }
}

public static int findMin(ArrayList<Integer> n){
    int minValue = Integer.MAX_VALUE; // Get value at index position 0 as the current smallest.
    int minIndex = -1;
    for(int i = 0; i < n.size(); i++){
        if(n.get(i) < minValue){
            minIndex = i;
        }
    }
    return minIndex;
}

Была некоторая путаница относительно того, возвращает ли метод findMin минимальное значение или минимальный индекс. Теперь он возвращает минимальный индекс. findMin также теперь вызывается только один раз, не для каждой итерации в цикле, что немного чище (и немного быстрее).

0 голосов
/ 06 декабря 2011

Вы можете использовать метод сортировки коллекции для сортировки списка. Документация

После сортировки первый элемент будет самым маленьким

0 голосов
/ 06 декабря 2011

Вы видите неожиданное поведение, потому что не выполняете контракт для List.get().Метод ожидает index в качестве аргумента и возвращает вам значение .Вы не должны сравнивать значение, возвращаемое get() с индексом.

Кроме того, в вашем методе findMin() вы должны инициализировать min в Integer.MAX_VALUE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...