2014-04-25 56 views
1

我想排序ArrayList<String>使用自定義Comparator。我的要求是,XX字符串應該是第一個字符串,其他人應遵循自然順序。排序ArrayList <String>與自定義比較器

我需要:[XX,XX,1,5,9,A,d,G,Q,Z]
我所得到的是[1,5,9,A,d,G, Q,Z,XX,XX]

以下是我的代碼:

public class Test { 
    public static void main(String[] args) 
    { 
     List<String> list = new ArrayList<String>(); 
     list.add("Z"); 
     list.add("5"); 
     list.add("D"); 
     list.add("G"); 
     list.add("XX");  
     list.add("9"); 
     list.add("Q"); 
     list.add("XX"); 
     list.add("1"); 
     list.add("A");  
     Collections.sort(list, new CustomComparator());  
     System.out.println(list);  
    } 
} 
class CustomComparator implements Comparator<String> 
{ 
    @Override 
    public int compare(String o1, String o2) {  
     if(o2.equals("XX")) { 
      return -1; 
     }  
     return o1.compareTo(o2); 
    } 
} 

EDIT:如果我改變比較器邏輯,用於:

@Override 
    public int compare(String o1, String o2) {  
     if(o2.equals("XX")) { 
      return 1; 
     }  
     return o1.compareTo(o2); 
    } 

我越來越:

[1,XX,9,A,Q,XX,5,d,G,Z]

請讓我知道如何着手。提前致謝。

回答

2

使用該比較器的實現:

@Override 
public int compare(String o1, String o2) {  
    if(o2.equals("XX")) { 
     return o1.equals("XX") ? 0 : 1; 
    } else if (o1.equals("XX")) { 
     return -1; 
    } 
    return o1.compareTo(o2); 
} 

原因:超越的問題時使用-1或1來保證它的一個明確的順序O1和O2的所有可能的元組,見javadoc是非常重要的:

實現者必須確保所有x和y的sgn(compare(x,y))== -sgn(compare(y,x))。 (這意味着當且僅當比較(y,x)引發異常時,比較(x,y)必須拋出異常。)

實現者還必須確保關係是可傳遞的:((compare(x,y) y)> 0)& &(比較(y,z)> 0))意味着比較(x,z)> 0。 [...]

+0

恭喜你,你的解決方案是唯一有效的一個 – nikis

+0

@nikis謝謝你,我習慣了這樣的比較,因爲我的僱主經常會問異國情調和過於複雜的比較策略,這裏只是非常簡化;-) –

1

寫的方法簡潔的方式:

public int compare(String o1, String o2) { 
    if (o1.equals(o2)) return 0; 
    if (o1.equals("XX")) return -1; 
    return (o2.equals("XX")) ? 1 : o1.compareTo(o2); 
}