2015-12-01 3 views
-2

Я пытаюсь найти минимум массива с десятью введенными точками, но мне как-то удалось создать что-то, что только найдет максимум. Помогите?нахождение минимума массива

import java.util.Scanner; 

public class Ex7_9Smallestt { 

    public static void main(String[] args) { 

     Scanner input = new Scanner(System.in); 
     int count = 0; 

     System.out.print("Welcome to Elisabeth's smallest number finder!\n"); 
     //print welcome message 

     double myList [] = new double[10]; //initialize array 

     while (count < 10) { //initialize for loop 
      //print enter a number and make that number an element in the array 
      int i = 0; 
      System.out.print("\nPlease enter a number:"); 
      myList[i] = input.nextDouble(); 
      count ++; 
     } 

     System.out.printf("The minimum is " + min(myList)); //print minimum 
    } 

    public static double min(double[] array) { 
     //create method to find lowest number 

     double minimum = array[0]; 
     int i = 0; 

     //initialize for loop 
     for (double e : array) { 
      if (array[i] < minimum) { 
       minimum = array[i]; 
       i++; 
      } 
     } 
     return minimum; 
    } 
} 
+0

Почему вы смешиваете индексы и коллекции для цикла в методе min? Почему бы просто не перебирать массив и не забывать индексы? – ncmathsadist

ответ

0

Во-первых, вы неправильно заполняете свой массив. В настоящее время у вас есть

int i = 0; 
System.out.print("\nPlease enter a number:"); 
myList[i] = input.nextDouble(); 
count ++; 

, возникающий на каждой итерации. Итак, вы устанавливаете i на ноль каждый раз и каждый раз сохраняете myList[i], так что вы просто заполняете myList[0] снова и снова. Вместо этого зациклируйте до count < myList.length и используйте myList[count] для присвоения значения для каждого индекса.

Во-вторых, вы используете цикл for-each без причины в своем методе минимального поиска. Я бы изменил это на обычный цикл цикла, так как вы используете i для индексации в ваш массив.

0

Прежде всего, это проще и выглядит намного лучше, просто используйте метод println(), а не print с символом \n.

Кроме того, почему бы не просто запросить пользователя Enter 10 values: и использовать for loop для int i<10?

В min() вы по существу создаете ad-hoc for loop в расширенном for loop. Это не нужно. Избавьтесь от int i полностью. Кроме того, вы сортируете только относительно следующего элемента. Вам нужно проверить, что это абсолютный минимум.

Я бы переключился с array на ArrayList<int>. Примечание: все в <> является параметризатором типа; как правило, вы должны использовать E в качестве заполнителя, что делает его универсальным алгоритмом (метод может работать с любым типом данных, который расширяет интерфейс Comparable). Таким образом, вы можете использовать итератор, а также использовать более эффективный алгоритм:

import java.util.Collection; 
import java.util.Iterator; 
import java.util.List; 

public static<Integer extends Comparable<Integer>> Integer findMin(Collection<Integer> c) { 
    Iterator<Integer> i=c.iterator(); 
    Integer current=i.next(); 
    Integer min=current; 
    Integer next; 

    while(i.hasNext()){ 
     next=i.next(); 
     if(min.compareTo(next)>0){ 
      min=next; 
     } 
    } 
    return min; 
} 

Edit: К сожалению, я неправильно понял ваш код; просто замените каждый экземпляр Integer в моем коде double в вашем.

1

Если вы используете для цикла, как что то

for (double candidate : array) { 
    if (candidate < minimum) { 
    minimum = candidate; 
    } 
} 

лучше, чем смешивание доступа по индексу.

@Test public void min() { 
    double[] array = new double[4]; 

    array[0] = 5; 
    array[1] = 2; 
    array[2] = 3; 
    array[3] = 7; 

    double min = array[0]; 

    for (double candidate : array) { 
     if (candidate < min) { 
      min = candidate; 
     } 
    } 

    assertEquals(2, min, 0.05); 
} 

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

с кодом это будет работать

for(double e: array){ 
    if(array[i] < minimum){ 
     minimum = array[i]; 

    } 
    i++; 
} 

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

2
for(double e: array){ 
    if(array[i] < minimum){ 
     minimum = array[i]; 
    } 
    i++; 
} 

Выше было бы работать, пока ваш ниже не будет.

for(double e: array){ 
    if(array[i] < minimum){ 
     minimum = array[i]; 
     i++; 
    } 
} 

Причина проста. Вы не увеличиваете i во всех случаях, и поэтому он застревает и сравнивает один и тот же элемент снова и снова. Это не возвращает максимум, это в большинстве случаев первый элемент.

Вам не нужно i, хотя, так как вы используете улучшенный цикл и это означает, что правильный подход будет

for(double e: array) { 
    if(e < minimum) { 
     minimum = e; 
    } 
} 

Или, если вам нравится i

for (int i = 0; i < array.length; i++) { 
    if (array[i] < minimum) { 
     minimum = array[i]; 
    } 
} 

Сочетание обоих типов петель работает, но это похоже на то, что это случайно.

Смежные вопросы