2015-12-08 12 views
5

Mam poniższy kod Java.Niepoprawna wartość indeksu tablic indeksowych

import java.util.Arrays; 

public class Cook { 
    public static void main(String[] args) { 
     int num[] = { 3, 1, 5, 2, 4 }; 
     getMaxValue(num); 
    } 

    public static void getMaxValue(int[] num) { 
     int maxValue = num[0]; 
     int getMaxIndex = 0; 
     for (int i = 1; i < num.length; i++) { 
      if (num[i] > maxValue) { 
       maxValue = num[i]; 
      } 
     } 
     getMaxIndex = Arrays.asList(num).indexOf(maxValue); 
     System.out.println(getMaxIndex + " and " +maxValue); 
    } 
} 

W powyższym kodzie próbuję odzyskać maksymalną wartość w tablicy, a także swojego indeksu, ale tutaj wyjście że jestem coraz to

-1 and 5 

Wartość maksymalna jest zwracana dobrze, ale nie jestem pewien, co jest nie tak z indeksem. To powinno faktycznie wydrukować 2, ale drukowanie -1, proszę dać mi znać, gdzie jestem źle i jak mogę to naprawić.

Thankd

+2

Czy naprawdę potrzebujesz Arrays ... indexOf w tym fragmencie kodu? –

+0

Jeśli poświęciłeś trochę czasu na drobiazgowe debugowanie i sprawdziłeś, co robi każda z 2 (!) Funkcji, których używasz, to wiesz. – njzk2

Odpowiedz

21

powinien aktualizować indeks max w pętli:

int maxValue = num[0]; 
    int getMaxIndex = 0; 
    for (int i = 1; i < num.length; i++) { 
     if (num[i] > maxValue) { 
      maxValue = num[i]; 
      getMaxIndex = i; 
     } 
    } 

Powodem Arrays.asList(num).indexOf(maxValue); powraca -1 jest to, że szereg pierwotnych jest przekształcany przez Arrays.asList do List pojedynczego elementu (The sama tablica) i że List nie zawiera maxValue (zawiera tylko oryginalną tablicę).

6

należy zaktualizować indeks podczas iteracji, getMaxIndex = i;

public static void getMaxValue(int[] num) { 
     int maxValue = num[0]; 
     int getMaxIndex = 0; 
     for (int i = 1; i < num.length; i++) { 
      if (num[i] > maxValue) { 
       maxValue = num[i]; 
       getMaxIndex = i; 
      } 
     } 
     System.out.println(getMaxIndex + " and " + maxValue); 
    } 

wyjście

2 and 5 

Poniżej jest coś @Eran ma na myśli.

Jest konwertowany na List z size 1, zawierający pojedynczy element (sama tablica).

Zgodnie Javadoc, indexOf

Zwraca indeks pierwszego wystąpienia określonego elementu w listę, lub -1 lista ta nie zawiera element.

Więc wyszukuje maxValueinside List i not inside array stored in 0th index of List.

enter image description here

1

powyżej odpowiedzi są poprawne, ale można też zrobić

import java.util.Arrays; 

public class Cook { 

    public static void main(String[] args) { 
     Integer num[] = { 3, 1, 5, 2, 4 }; 
     getMaxValue(num); 
    } 

    public static void getMaxValue(Integer[] num) { 
     int maxValue = Arrays.asList(num).get(0); 
     int getMaxIndex = 0; 
     for (int i = 1; i < num.length; i++) { 
      if (Arrays.asList(num).get(i) > maxValue) { 
       maxValue = Arrays.asList(num).get(i); 
      } 
     } 
     getMaxIndex = Arrays.asList(num).indexOf(maxValue); 
     System.out.println(getMaxIndex + " and " +maxValue); 
    } 
} 
+0

Dlaczego wszystkie te transformacje z 'Arrays.asList'? Jeśli używasz 'Integer []', po prostu wykonaj: 'List l = Arrays.asList (num); int max = Collections.max (l); int indexMax = l.indexOf (max); '. 3 linie ... –

4

Każdy daje dobre wskazówki, ale nikt nie wyjaśnia szczegółowo, dlaczego to nie działa.

Arrays.asList() jest zdefiniowany z podpisem public static <T> List<T> asList(T... a), który przyjmuje zmienną liczbę obiektów lub po prostu tablicę obiektów.

Jednak int jest typem pierwotnym, a nie typem obiektu. Tak więc Arrays.asList(num) nie jest interpretowany jako "weź tę tablicę", ale jako "weź ten obiekt jako jeden obiekt". Wynikiem jest zatem List<int[]>, gdzie nie można znaleźć podanej liczby (oczywiście).

Lepiej więc zachować indeks przy wyszukiwaniu maksimum, co już sugerują inne odpowiedzi.

Powiązane problemy