2012-05-20 46 views
8

我有我在排序列表的類。使用匿名類的java排序

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

} 


} 

程序運行後,我得到這些值:

1  
third 
first 
second 
2 
fourth 

我的問題是什麼是Collection.sort()的行爲函數在這裏。從比較函數返回-1時,我們得到列表的相反順序。那我們怎樣才能得到其他的排序順序呢?返回0和1的作用是什麼?

+0

你想作爲輸出什麼? –

回答

8

最後,我以這種方式修改排序函數以獲取排序數據。

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

這裏是the javadoc說:

INT比較(T 01,T O2)

比較它的兩個參數的順序。由於第一個參數小於,等於 ,或者大於第二個參數,則返回負整數,零或正整數。

您的比較器實現不遵守此合同,因此結果是不確定的。如果它認爲o1小於o2,它必須返回一個負值。如果它認爲o1大於o2,它必須返回一個正值。如果它認爲o1等於o2,它必須返回0。它當然必須是一致的。如果o1 < o2,那麼o2> o1。如果o1和o2分別是0,< o3。

4

返回0和1的作用是什麼?

這就是說o1等於o2,或者o1大於o2。

您的匿名比較目前表示,O1小於O2,o1o2每一個可能的值。這根本沒有意義,並導致sort的行爲是不可預測的。

A 有效比較器必須實現compare(Object, Object)方法,以便它的行爲符合Comparator接口的要求。


如果你真正的目的是要扭轉一個列表中的元素的順序,那麼就不要使用sort。從比較的Javadoc中使用Collections.reverse()

1

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. 

所以定義的功能比小於,等於或大於你的類,你缺少平等和更大的功能。

4

java.util.Comparator類說,在compare方法Java文檔:

負整數,零,或作爲 第一個參數的正整數比 第二小於,等於,或更大。

你可以用下面的代碼:

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

此代碼必須努力fine.You可以改變比較方法更多的靈活性。

compareTo方法在String類說,在它的Java文檔:

0如果參數串等於 此字符串;如果此字符串 按字典順序小於字符串參數,則該值小於0;而 的值大於0,如果該字符串是 按字典順序大於字符串參數。

4

您可以使用匿名類是這樣的:

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