2011-12-06 41 views
1

以下代碼應該讀取一些數字,並將最小編號放在'< ==最小編號'旁邊。這裏有什麼問題?它似乎沒有工作!每次似乎都將錯誤的數字指定爲最小值。Java - 查找最小編號

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; 

    } 

} 

回答

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

通過調用numbers.get()i獲取槽的值。

+0

謝謝 - 修復它。 – mino

0

您會看到意外的行爲,因爲您不服從List.get()的合同。該方法預計索引作爲參數,並返回。您不應該將get()返回的值與索引進行比較。

另外,在您的findMin()方法中,您應初始化minInteger.MAX_VALUE

0

您可以使用收集排序方法對列表進行排序。 Documentation

排序之後第一元件將是最小的一個

+0

O(n lg n)vs O(n)? – Will

0

這裏是一種改進的,工作樣品(儘管不容易測試掃描儀輸入):

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
if (n.get(i) < min) 

應該是:

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

See it

1

可變minfindMin()實際上是n的最小數目的索引。 更改此:

if (n.get(i) < min) 

到:

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

商店進入for循環之前的findMin()返回值:

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)); 
    } 
} 
0

只需更改下面的代碼,這將肯定工作。

**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;  
}