2012-05-20 29 views
8

Ben bir liste sıralama var sınıfım var. Program çalıştırıldıktan sonraAnonim sınıf kullanarak java sıralama

import java.util.*; 

public class First 
{ 

    private static HashMap<String,Second> msgs; 

    public static void main(String[] args) 
    {   

    List<String> ls=new ArrayList<String>(); 


    ls.add("fourth"); 
    ls.add("2"); 
    ls.add("second"); 
    ls.add("first"); 
    ls.add("third"); 
    ls.add("1"); 

    Iterator it=ls.iterator(); 

    // before sorting 
    while(it.hasNext()) 
    { 
    String s=(String)it.next(); 
    System.out.println(s); 
    } 

    Collections.sort(ls, new Comparator(){ 
     public int compare(Object o1, Object o2) { 
      return -1; 
      // it can also return 0, and 1 
     } 
    }); 

System.out.println(" "); 

//after sorting 
    Iterator iti=ls.iterator(); 
    while(iti.hasNext()) 
    { 
    String s=(String)iti.next(); 

    System.out.println(s); 
    } 

} 


} 

, ben bu değerleri almak:

1  
third 
first 
second 
2 
fourth 

Sorum Collection.sort davranışı() fonksiyonu burada budur. Karşılaştırma işlevinden -1 geri dönüşünde, listenin ters sırasını alırız. Öyleyse başka sıralama emirlerini nasıl alabiliriz? 0 ve 1 geri dönüşünün rolü nedir?

+0

Eğer çıktı olarak ne istiyorsunuz? –

cevap

8

Son olarak, sıralı veri almak için bu şekilde sıralama işlevini değiştirmiştir.

Collections.sort(ls, new Comparator() 
          { 

          public int compare(Object o1, Object o2) 
          { 
          String sa = (String)o1; 
          String sb = (String)o2; 

          int v = sa.compareTo(sb); 

          return v;   

           // it can also return 0, and 1 
          } 
          }  
        ); 
6

İşte the javadoc söylüyor:

int

sipariş için iki argüman karşılaştırır (T o1 T o2) karşılaştırın. İlk argüman 'a eşit veya daha büyük, negatif veya daha büyük bir tamsayı, sıfır veya pozitif bir tamsayı döndürür.

Karşılaştırıcı uygulamanız bu sözleşmeye uymuyor, dolayısıyla sonuç belirsiz. Eğer o1'in o2'den daha az olduğunu düşünürse negatif bir değer döndürmelidir. O1'in o2'den büyük olduğunu düşünürse pozitif bir değer döndürmelidir. Ve o1'in o2'ye eşit olduğunu kabul etmesi durumunda 0'a dönmelidir. Ve elbette tutarlı olmalı. Eğer o < o2 ise o2> o1. Eğer o < o2 ve o2 < o3 ise o1 < o3.

4

0 ve 1 döndürme rolü nedir?

O1'in o2'ye eşit veya o1'in o2'den büyük olduğu söylenir.

Sizin anonim karşılaştırıcı şu anda o1 o1 ve o2 olası her değeri için o2, az olduğunu söylüyor. Bu sadece bir anlam ifade etmiyor ve sort'un davranışının öngörülemez olmasına neden oluyor. o Comparator arayüzünün ihtiyaçlarına göre davranır böylece

A geçerli karşılaştırıcı compare(Object, Object) yöntemi uygulamalıdır. Gerçek amaç bir listede öğelerin sırasını tersine çevirmek için ise


ardından sort kullanmayın.

Compares its two arguments for order. Returns a negative integer, 
zero, or a positive integer as the first argument is less than, equal 
to, or greater than the second. 

Yani işlevsellik eşit, daha az veya daha sınıfınız için yerine, eksik eşit ve daha büyük işlevi tanımlamak Karşılaştırıcısı Javadoc gelen Collections.reverse()

1

kullanın.

4

java.util.Comparator sınıfı compare yöntem Java doc söyler:

negatif tamsayıdır, sıfır veya ilk bağımsız değişken olarak pozitif bir tam sayı saniyeden daha, daha küçük, ona eşit, ya da daha fazladır.

kod aşağıdaki kullanabilirsiniz:

Collections.sort(ls, new Comparator() 
{ 
    public int compare(Object o1, Object o2) 
    { 
     if(o1 instanceof String && o2 instanceof String) 
     { 
      String s_1 = (String)o1; 
      String s_2 = (String)o2; 

      return s_1.compareTo(s_2); 
     } 
     return 0;  
    } 
}); 

Bu kod fine.You fazla esneklik için yöntem karşılaştırmak değiştirebilir çalışmalıdır.

compareTo yöntem String sınıfında da Java doc söyler:

değeri 0 dizge bu dizi eşit olması durumunda; Bir değer daha az 0 bu dize dize argümanı daha sözlük sırasında azsa; ve 0 daha büyük bir değeri bu dize dize argümanı daha sözlük sırasında büyük ise.

4

Anonim sınıf bu şekilde kullanabilirsiniz:

TreeSet<String> treeSetObj = new TreeSet<String>(new Comparator<String>() { 
    public int compare(String i1,String i2) 
    { 
     return i2.compareTo(i1); 
    } 
}); 
İlgili konular