今天寫Android應用,遇到一個對List進行排序的問題,經過google的提示,發現用Collections.sort(List list, Comparator c) 就可以對List/ArrayList進行排序,很Happy的去寫代碼做測試,結果發現排序沒有起作用,檢查之,發現代碼沒什麼問題啊(代碼如下),奇怪了。<b></b>
public void changeSort(int type){
Comparator<ItemBean> comparator;
Toast.makeText(this, "type=="+type, 5).show();
switch(type){
case 1:{
// 價格從低到高排序
comparator = new PriceLowToHighComparator();
Collections.sort(list, comparator);
}
break;
case 2:{
// 價格從高到低排序
comparator = new PriceHighToLowComparator();
}
adapter.setItemBeanList(list);
adapter.notifyDataSetChanged();
}
public class PriceHighToLowComparator implements Comparator<ItemBean> {
@Override
public int compare(ItemBean itemBean1, ItemBean itemBean2) {
double price1 = 0;
double price2 = 0;
if(itemBean1.getItemPrice() != null && !"".equals(itemBean1.getItemPrice())){
price1 = Double.parseDouble(itemBean1.getItemPrice());
if(itemBean2.getItemPrice() != null && !"".equals(itemBean2.getItemPrice())){
price2 = Double.parseDouble(itemBean2.getItemPrice());
if(price1 > price2){
return -1;
else if(price1 < price2){
return 1;
else{
return 0;
<b></b>
然後就是各種改傳回值,反複改了三次以後發現問題所在,傳回值不正确,上面的這個類是list的價格從高到低的規則類,Collections.sort(List list, Comparator c) 會根據傳回值來對list中的資料進行排序,最初如果price1>price2,則return 1,但是試驗發現list中的資料無變化,随後改成return -1,試驗發現list中的資料能按照預想的效果排序了,可是新的問題出來了,為什麼price1>price2,但是要傳回-1呢?
繼續google之,發現http://solodu.iteye.com/blog/630891 這篇文章的主人在文章結尾說了一段話“要充分了解排序就必須先了解最後的return 0, -1 , 1 這三個數字代表的含義。它們不是代表數字而是代表前面和後面要比較的值哪個大哪個小?如果是0表示要比較的這兩個數字相等。如果是1表示前面數字大,如果-1表示前面數字小。要了解這個就沒問題了。”但是結合我自己寫的這個排序規則,我突然覺得0,1,-1這三個數好像不是說誰大誰小,而是一個排序的問題,當傳回-1時,前面的變量(即price1)排在後面的變量(price2)的前面,反之則排在後面。果真如此麼,正好就着這次的項目的排序要求比較多,也就多寫幾個規則測試一下,結果确實如此,根據不同規則,如果想将前面的變量放到後面的變量之前,則傳回-1即可。
本文轉自 sw840227 51CTO部落格,原文連結:http://blog.51cto.com/jerrysun/608416,如需轉載請自行聯系原作者