2013-04-14 17 views
36

Potrzebuję uzyskać wartość indeksu minimalnej wartości w mojej liście tablicowej w Javie. Moja lista tablicowa zawiera kilka elementów pływających i próbuję wymyślić sposób, w jaki mogę uzyskać numer indeksu najmniejszego elementu pływającego, aby móc użyć tego numeru indeksu w innym miejscu kodu. Jestem początkującym, więc proszę, nie nienawidźcie mnie. Dzięki!Jak znaleźć minimalną wartość w tablicy ArrayList wraz z numerem indeksu? (Java)

+0

myślę, że wybraliśmy rozwiązanie jest niekompletne. wciąż czegoś brakuje! Co się stanie, jeśli numer min jest obecny kilka razy? To przecież lista. Myślę więc, że powinien zwrócić listę, jeśli indeksy dla wartości minimalnej –

Odpowiedz

71

Można użyć Collections.min i List.indexOf:

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

Jeśli chcesz przechodzić na liście tylko raz (powyżej mogą przemierzać go dwa razy):

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

Twoje rozwiązanie wciąż czegoś nie ma! Co się stanie, jeśli numer min jest obecny kilka razy? To przecież lista. Myślę więc, że powinieneś zwrócić listę, jeśli indeksy dla wartości minimalnej –

+1

@AdelBoutros. Jeśli tego chce OP, to rozwiązanie może być traktowane jako punkt wyjścia i ulepszone. –

+0

@MarimuthuMadasamy Dzięki, bro .. jesteś bohaterem .., master maind –

8

spróbuj tego:

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" można zmienić na 'f Dukeling

+0

@ Dukeling, masz na myśli f <= min? – BlackJoker

+0

Nie, mam na myśli 'f Dukeling

11

Powinno to zrobić za pomocą wbudowanych funkcji.

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

Musisz przemierzać całą tablicę i utrzymać dwie wartości pomocnicze:

  • Minimalna wartość można znaleźć (na drodze ku końcowi)
  • Indeks miejscu, gdzie znaleziono wartość minimalna:

Załóżmy, że twoja tablica nazywa się myArray. Na końcu tego kodu minIndex ma indeks o najmniejszej wartości.

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

Zakłada to najgorszy scenariusz: całkowicie losową tablicę. Jest to algorytm O (n) lub algorytm n, co oznacza, że ​​jeśli masz w swojej macierzy elementy n, musisz spojrzeć na wszystkie z nich zanim poznasz swoją odpowiedź. Algorytmy O (n) są najgorsze, ponieważ zajmują dużo czasu, aby rozwiązać problem.

Jeśli twoja macierz jest posortowana lub ma jakąś inną określoną strukturę, algorytm można zoptymalizować tak, aby był szybszy.

Powiedziawszy to, chyba że masz ogromną liczbę tysięcy wartości, nie martw się o optymalizację, ponieważ różnica między algorytmem O (n) i szybszym nie byłaby zauważalna.

4

Jest łatwiejszy sposób znaleźć min całkowitą w liście tablicy:

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

A co z indeksem? – dedek

Powiązane problemy