2013-03-14 4 views
9
ArrayList<String> dirNo = new ArrayList<String>(); 

dirNo.add("1"); 
dirNo.add("2"); 
dirNo.add("3"); 
dirNo.add("4"); 
dirNo.add("5"); 
dirNo.add("6"); 
dirNo.add("7"); 
dirNo.add("8"); 
dirNo.add("9"); 
dirNo.add("10"); 
dirNo.add("11"); 

System.out.println("max : " + Integer.parseInt(Collections.max(dirNo))); 

Dopo l'esecuzione sopra il codice, stampare come uscita.Perché Collections.max() non restituisce il valore massimo effettivo per una raccolta di stringhe?

Ma in realtà il valore massimo deve essere .

Perché sto ricevendo come max?

+1

Stai facendo confronto String. È qualcosa di completamente diverso dal confronto tra interi. Cambia il tuo codice per usare Integer e tutto dovrebbe funzionare come un incantesimo. – Joshua

risposta

30

Poiché i tuoi elementi sono stringhe, Collections.max() restituisce il valore più grande lexicographically.

Se si desidera confrontare numericamente le stringhe, è necessario utilizzare la versione a due argomenti di Collections.max() e fornire un comparatore appropriato:

ArrayList<String> dirNo = new ArrayList<String>(); 

    dirNo.add("1"); 
    dirNo.add("2"); 
    dirNo.add("3"); 
    dirNo.add("4"); 
    dirNo.add("5"); 
    dirNo.add("6"); 
    dirNo.add("7"); 
    dirNo.add("8"); 
    dirNo.add("9"); 
    dirNo.add("10"); 
    dirNo.add("11"); 

    Comparator<String> cmp = new Comparator<String>() { 
     @Override 
     public int compare(String o1, String o2) { 
      return Integer.valueOf(o1).compareTo(Integer.valueOf(o2)); 
     } 
    }; 
    System.out.println("max : " + Collections.max(dirNo, cmp)); 
1

Si utilizza una raccolta String! Il confronto delle stringhe è completamente diverso dalla comparsione numerica.

valore String "2" > "11" perché '2' > '1' (differenza primo carattere)

0

Modifica stringa a intero

ArrayList<Integer> dirNo = new ArrayList<Integer>(); 

Questo è tutto.

Problemi correlati