2012-07-07 133 views
1
public static void main(String[] args) {  
    String[] errorStr = new String[] { 
     "Line No: " + " " + 1, 
     "Line No: " + " " + 11, 
     "Line No: " + " " + 10, 
     "Line No: " + " " + 2, 
     "Line No: " + " " + 3 
    }; 

    Arrays.sort(errorStr);  
    for(Object obj : errorStr){ 
     System.out.println(obj); 
    } 
} 

有人可以指出爲什麼排序不起作用嗎?排序陣列不工作

expected is, 

Line No: 1 
Line No: 2 
Line No: 3 
Line No: 10 
Line No: 11 

Actual is, 
Line No: 1 
Line No: 11 
Line No: 10 
Line No: 2 
Line No: 3 

回答

7

它的排序字母排序 - 和字典順序「11」在「2」,與之前的「號線:11」在「行號:2」之前。

如果你想「更智能」排序,你需要實現一個Comparer<String>,它執行適當的分析以比較字符串。

如果所有的值都實際上「號線:」後面的值,我只是將其轉化爲一個數組或整數列表,因爲這是你想代表自然數據。 ..和排序的int值的數組將按預期工作。

從根本上說,這就是你得到的治療數字作爲字符串:)

+1

或者,寫保存行號的特殊類在適當的'int'字段中並實現'Comparable',並在將它們轉換爲'String'之前進行排序。 – 2012-07-07 15:45:36

+2

@LouisWasserman:看看我的編輯 - 它看起來像一個簡單的轉換爲整數集合將更適合於我:) – 2012-07-07 15:46:38

+1

請參閱:[排序在可能包含數字的字符串](http://stackoverflow.com/問題/ 104599 /按字符串排序可能包含一個數字) – 2012-07-07 15:47:02

2

正如喬恩說,它的字典順序排序的元素。您可以嘗試使用所需數字創建一個int數組,將其排序,然後將「Line No:」連接到每個元素。我想解決策略那種依賴於元素是如何失靈了擺在首位...

編輯:繼承人的代碼示例

int[] errorInt = new int[]{ 1,11,10,2,3} ; 
    String[] errorString = new String[ errorInt.length ]; 
    Arrays.sort(errorInt); 
    for(int i = 0; i < errorInt.length; i++) { 
     errorString[i] = "Error No:" + errorInt[i]; 
    } 
+0

我有類似的問題,您的解決方案聽起來像它可能適用於我。你有一個非常快速和骯髒的例子,你可以編輯? – 2012-07-07 15:51:26