2014-02-06 36 views
-1

The app itself running to show my issue使用compareTo來比較字符串的數字不按計劃工作,我該如何解決這個問題?

因此,我試圖讓它通過使用2d字符串數組的第二列來從最高值到最低值排列此列表。

通過在網上尋找答案似乎很簡單,我只需要做我自己的比較。

看起來像這樣的代碼

 Arrays.sort(stockPriceAndNameSorted, new Comparator<String[]>() { 
     @Override 
     public int compare(final String[] entry1, final String[] entry2) { 
      return entry1[1].compareTo(entry2[1]); 
     } 
    }); 

但是,正如你可以看到它是不是被責令,因爲它應該,例如,如果我給它的值,1,2,3,4,5它工作正常。然後將其更改爲1,11,3,4,5,但它不會按照原樣運行。

+3

它按字母順序排列,這是有道理的字符串進行排序。你應該使用一個數字而不是一個字符串來表示你想要的內容...... – assylias

+0

但是你不能在java中使用一個帶有String和int的2d數組,而不使用無法排序的對象。 –

+0

然後創建一個封裝字符串和int的類... – assylias

回答

0

您比較了String值,這會導致與數字順序不同的順序。比較整數值代替:

Arrays.sort(stockPriceAndNameSorted, new Comparator<String[]>() { 
    @Override 
    public int compare(final String[] entry1, final String[] entry2) { 
     return Integer.valueOf(entry1[1]).compareTo(Integer.valueOf(entry2[1])); 
    } 
}); 

你可能想以另數字類Integer如果,例如,你有你的字符串小數點的數字。另外,如果字符串值不能被解析爲數字,則可能需要處理NumberFormatException

+0

是的,它非常有用,非常感謝。我確實走下了試圖將其轉換爲整數的路線,但我不太確定。 –

0

它按字母順序排序,這對字符串是有意義的。你應該使用一個數字而不是一個字符串來實現你想要的。

或者,你可以這樣做:

int price1 = Integer.parseInt(entry1[1]); 
int price2 = Integer.parseInt(entry2[1]); 
return Integer.compare(price1, price2); 

但是,這感覺有點醜是誠實的。

一個更好的方式是(我ommitting干將等):

class Item { 
    String name; 
    int price; 
} 

Item[] items = ...; //or use an ArrayList 
Arrays.sort((stockPriceAndNameSorted, new Comparator<String[]>() { 
    @Override 
    public int compare(final Item entry1, final Item entry2) { 
     return Integer.compare(entry1.price, entry2.price); 
    } 
}); 
+0

下次我會記住這一點。我不得不使用一個字符串,因爲它是2d數組的一部分,並且你不能對java中的對象進行排序,我相信。 謝天謝地@rgettman對我有答案。 –

+0

所以我試過這個方法,但是當我到了array.sort時,它現在拋出了一堆錯誤。 而我現在不會嘗試排序Item類本身而不是stockPriceAndNameSorted數組? –