2015-12-08 11 views
5

Ho il seguente codice Java.Valore di stampa dell'indice di array valore errato

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

Nel codice di cui sopra che sto cercando di recuperare il valore massimo nella matrice ed anche il suo indice, ma qui l'output che sto ricevendo è

-1 and 5 

viene restituito il valore massimo bene, ma non sono sicuro di cosa c'è che non va nell'indice. Questo dovrebbe effettivamente stampare 2, ma sta stampando -1, per favore fatemi sapere dove sto andando male e come posso risolvere questo.

Thankd

+2

Hai davvero bisogno di matrici ... indexOf in questo frammento di codice? –

+0

Se si è preso il tempo di fare un po 'di debugging e ispezionato quello che fa ciascuna delle 2 (!) Funzioni che usi, lo sapresti. – njzk2

risposta

21

Si dovrebbe aggiornare l'indice massimo nel loop:

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

La ragione Arrays.asList(num).indexOf(maxValue); ritorni -1 è che una matrice di primitive è convertito da Arrays.asList ad un List di un singolo elemento (la array stesso) e che List non contiene maxValue (contiene solo l'array originale).

6

necessità di aggiornare indice durante l'iterazione, 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); 
    } 

uscita

2 and 5 

seguito è qualcosa @Eran si riferisce.

Viene convertito in List di size 1, contenente un singolo elemento (la matrice stessa).

Secondo Javadoc, indexOf

restituisce l'indice della prima occorrenza dell'elemento specificato in questa lista, oppure -1 se questo elenco non contiene l'elemento.

Così ricerche per maxValueinside List e not inside array stored in 0th index of List.

enter image description here

1

sopra risposte sono corrette, ma si può anche fare

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

Perché tutte queste trasformazioni con 'Arrays.asList'? Se stai usando un 'Integer []', fai semplicemente: 'List l = Arrays.asList (num); int max = Collections.max (l); int indexMax = l.indexOf (max); '. 3 linee ... –

4

Ognuno dà buoni consigli, ma nessuno spiega in dettaglio perché non funziona.

Arrays.asList() è definito con la firma public static <T> List<T> asList(T... a) che accetta un numero variabile di oggetti o solo una matrice di oggetti.

Tuttavia, int è un tipo primitivo e non un tipo di oggetto. Pertanto, Arrays.asList(num) non viene interpretato come "accetta questo array", ma come "accetta questo oggetto come un unico oggetto". Il risultato è quindi un List<int[]>, in cui il numero specificato (ovviamente) non può essere trovato.

Quindi è meglio mantenere l'indice durante la ricerca del massimo, come già suggerito dalle altre risposte.

Problemi correlati