Sayı

2016-03-22 24 views
3

Yerel sort yöntemini kullanarak öğeleri sipariş çalışıyorum.Sayı

Kodu:

List<String> list = new ArrayList(); 
Collections.sort(list); 

Giriş 1:

Before order: 65 31 37 37 72 76 61 35 57 37 
After order: 31 35 37 37 37 57 61 65 72 76 
Expected:  Ok. 

Giriş 2:

Before order: 45 186 185 55 51 51 22 78 64 26 49 21 
After order: 185 186 21 22 26 45 49 51 51 55 64 78 
Expected:  21 22 26 45 49 51 51 55 64 78 185 186 

sorun meth olduğu Bazı durumlarda yanlış sıralanıyor, nasıl çözebilirim?

+2

bir 'Comparator' – Ramanlfc

+1

Bize beklenen sonucu güncel sonuç söyleyebilir kullanabilir miyim? – Brian

+0

@Iyen, tamam, bitti. – developer033

cevap

5

List<String>, Collections.sort, String (s) 'in leksikolojik olarak sipariş vermesi var. Eğer String (ler) kullanması gerekir eğer o zaman (varsayılan String sipariş istediğini olmadığı için) özel bir Comparator sağlamanız gerekir, bir List<Integer>

gibi
List<Integer> al = Arrays.asList(45, 186, 185, 55, 51, 51, 22, 78, 64, 26, 49, 21); 
Collections.sort(al); 
System.out.println(al); 

kullanmak Fakat başladı. (Ilk örnek gibi) verir şey gibi

List<String> al = Arrays.asList("45", "186", "185", "55", "51", "51", // 
     "22", "78", "64", "26", "49", "21"); 
Collections.sort(al, new Comparator<String>() { 
    @Override 
    public int compare(String o1, String o2) { 
     return Integer.compare(Integer.parseInt(o1), Integer.parseInt(o2)); 
    } 
}); 
System.out.println(al); 

Sen Tamsayı karşılaştırıcı kullanılarak yapılmalıdır

[21, 22, 26, 45, 49, 51, 51, 55, 64, 78, 185, 186] 
+5

Muhtemelen Java 8'de bunu özellikle kısa bir sürede yapabilirsiniz: 'list.sort (Comparator.comparingInt (Tamsayı :: parseInt));' –

+1

Teşekkürler. Ve evet onu String olarak kullanmalıyım. Güzel katkı @PaulBoddington. Bu arada, @ElliottFricsh kodunu yazdığımda, Netbeans bana lambda: '(String o1, String o2) -> Integer.compare (Integer.parseInt (o1), Integer.parseInt (o2)) kullanmak için başka bir seçenek gösterir.); '. Sadece katkıda bulunmak. – developer033

0

.

List<Integer> list = new ArrayList(); 
Collections.sort(list); 

veya

List<String> list = Arrays.asList(new String[]{"45", "186", "185", "55", "51", "51", "22", "78", "64", "26", "49", "21"}); 
Comparator<String> cmp = (String o1, String o2) -> Integer.valueOf(o1).compareTo(Integer.valueOf(o2)); 
Collections.sort(list,cmp); 
System.out.println(list);