2013-03-14 17 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))); 

Po wykonaniu powyższego kodu, wydrukuj jako wynik.Dlaczego Collections.max() nie zwraca rzeczywistej maksymalnej wartości dla kolekcji ciągów?

Ale faktycznie maksymalna wartość powinna wynosić .

Dlaczego otrzymuję jako maksimum?

+1

Wykonujesz porównanie ciągów. To coś zupełnie innego niż porównanie całkowite. Zmień swój kod, aby używać Integer i wszystko powinno działać jak urok. – Joshua

Odpowiedz

30

Ponieważ twoje elementy są ciągami, Collections.max() zwraca wartość, która jest największa lexicographically.

Jeśli chcesz porównać ciągi numerycznie, trzeba użyć wersji dwu argument Collections.max() i dostarczyć odpowiedniego komparatora:

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

Używasz kolekcji String! Porównanie łańcuchów różni się od porównania liczb.

wartość String "2" > "11" ponieważ '2' > '1' (pierwsza różnica znaków)

0

Zmień String do Integer

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

to wszystko.