2013-04-14 97 views
36

Tôi cần lấy giá trị chỉ mục của giá trị nhỏ nhất trong danh sách mảng của tôi trong Java. Danh sách của tôi chứa một số float, và tôi đang cố gắng nghĩ về một cách mà tôi có thể lấy số chỉ mục của phao nhỏ nhất để tôi có thể sử dụng số chỉ mục đó ở đâu đó trong mã của tôi. Tôi là người mới bắt đầu, vì vậy xin đừng ghét tôi. Cảm ơn!Cách tìm giá trị nhỏ nhất trong ArrayList, cùng với số chỉ mục? (Java)

+0

Tôi nghĩ rằng đã chọn giải pháp là không đầy đủ. nó vẫn còn thiếu cái gì đó! Điều gì xảy ra nếu số min xuất hiện nhiều lần? Đó là sau khi tất cả một danh sách. Vì vậy, tôi nghĩ rằng nó sẽ trả về một danh sách nếu các chỉ số cho giá trị min –

Trả lời

71

Bạn có thể sử dụng Collections.minList.indexOf:

int minIndex = list.indexOf(Collections.min(list)); 

Nếu bạn muốn đi qua danh sách một lần duy nhất (ở trên có thể đi qua nó hai lần):

public static <T extends Comparable<T>> int findMinIndex(final List<T> xs) { 
    int minIndex; 
    if (xs.isEmpty()) { 
     minIndex = -1; 
    } else { 
     final ListIterator<T> itr = xs.listIterator(); 
     T min = itr.next(); // first element as the current minimum 
     minIndex = itr.previousIndex(); 
     while (itr.hasNext()) { 
      final T curr = itr.next(); 
      if (curr.compareTo(min) < 0) { 
       min = curr; 
       minIndex = itr.previousIndex(); 
      } 
     } 
    } 
    return minIndex; 
} 
+0

Giải pháp của bạn vẫn thiếu một cái gì đó! Điều gì xảy ra nếu số min xuất hiện nhiều lần? Đó là sau khi tất cả một danh sách. Vì vậy, tôi nghĩ bạn nên trả lại một Danh sách nếu các chỉ số cho giá trị nhỏ nhất –

+1

@AdelBoutros Nếu đó là những gì OP muốn, giải pháp này có thể được lấy làm điểm khởi đầu và được cải thiện. –

+0

@MarimuthuMadasamy Cảm ơn bro..you là người anh hùng .., thạc sĩ mai –

8

thử điều này:

public int getIndexOfMin(List<Float> data) { 
    float min = Float.MAX_VALUE; 
    int index = -1; 
    for (int i = 0; i < data.size(); i++) { 
     Float f = data.get(i); 
     if (Float.compare(f.floatValue(), min) < 0) { 
      min = f.floatValue(); 
      index = i; 
     } 
    } 
    return index; 
} 
+0

'Float.compare (f.floatValue(), min) <0' có thể được thay đổi thành' f Dukeling

+0

@ Dukeling, bạn có nghĩa là f <= min? – BlackJoker

+0

Không, ý tôi là 'f Dukeling

11

Điều này sẽ làm điều đó bằng cách sử dụng chức năng tích hợp sẵn.

public static int minIndex (ArrayList<Float> list) { 
    return list.indexOf (Collections.min(list)); } 
-1

Bạn phải đi qua toàn bộ mảng và giữ hai giá trị phụ trợ:

  • Giá trị tối thiểu mà bạn tìm (trên đường về phía cuối)
  • Chỉ số nơi mà bạn tìm thấy giá trị nhỏ nhất

Giả sử mảng của bạn được gọi là myArray. Ở cuối mã này, minIndex có chỉ mục có giá trị nhỏ nhất.

var min = Number.MAX_VALUE; //the largest number possible in JavaScript 
var minIndex = -1; 

for (int i=0; i<myArray.length; i++){ 
    if (myArray[i] < min){ 
     min = myArray[i]; 
     minIndex = i; 
    } 
} 

Điều này giả định trường hợp xấu nhất: một mảng hoàn toàn ngẫu nhiên. Nó là một thuật toán O (n) hoặc thứ tự n thuật toán, có nghĩa là nếu bạn có các phần tử n trong mảng của mình, thì bạn phải xem tất cả chúng trước khi biết câu trả lời của bạn. Các thuật toán O (n) là những thuật toán tồi tệ nhất vì chúng mất rất nhiều thời gian để giải quyết vấn đề.

Nếu mảng của bạn được sắp xếp hoặc có bất kỳ cấu trúc cụ thể nào khác, thì thuật toán có thể được tối ưu hóa để nhanh hơn. Tuy nhiên, có nói rằng, trừ khi bạn có một mảng khổng lồ của hàng ngàn giá trị thì đừng lo lắng về việc tối ưu hóa vì sự khác biệt giữa thuật toán O (n) và một thuật toán nhanh hơn sẽ không đáng chú ý.

4

Có một cách dễ dàng hơn để tìm thấy một số nguyên phút trong array list:

int min = array.get(0); 
     for (int i : array){ 
      min = min < i ? min : i; 
     } 
+0

Và còn về chỉ mục thì sao? – dedek

Các vấn đề liên quan