JAVA List的自定義排序

在單線程中吃既,ArryList和HashMap的查找速度是相當快的。
本人在工作中有利用ArryList<HashMap<String,String>>當作緩存中的數(shù)據(jù)庫已日,今天寫了排序功能嘿架,拿出來分享瓶珊。
不足之處歡迎指正。

前言

我們在使用一般排序的時候耸彪,會使用Collections.sort(List<T>)方法伞芹,T為基本數(shù)據(jù)類型或String。

當List的參數(shù)為集合類或?qū)ο蟛跄龋蛞獙崿F(xiàn)自定義排序唱较,就要使用Collections.sort(List<Object> list, Comparator<? super Object> c)方法,并且重寫Comparator的compare()方法召川。

以String類型的compareTo()方法為例南缓,會比較兩個字符串的ASCII碼,并返回大小荧呐。
比如arg0.compareTo(arg1):
1.當arg0 < arg1,返回值小于0汉形;
2.當arg0 == arg1,返回值等于0;
3.當arg0 > arg1,返回值大于0倍阐;

當我們重寫Comparator的compare()方法概疆,同樣通過上述三種返回值來決定排序順序。

Collections.sort()為升序排列收捣,當Comparator.compare(arg0届案,arg1)返回值大于0庵楷,會改變arg0和arg1的排序罢艾。

正文

首先導入包:

import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;
import java.util.Collections;
import java.util.Comparator;

使用靜態(tài)字段和方法。聲明成員變量:

private static String[] orderList;
private static int[] orderTypeList;
private static String order;

1.簡單排序

1.1 以HashMap中的一個值為索引尽纽,對ArrayList進行升序排列:

public static void sort(List<HashMap<String,String>> list,String name){ 
    order = name;
    Collections.sort(list, new Comparator<HashMap<String,String>>(){
        public int compare(HashMap<String, String> arg0,HashMap<String, String> arg1) { 
            return arg0.get(order).compareTo( arg1.get(order)); 
        } 
    });
    order = null;
}

1.2 以HashMap中的一個值為索引咐蚯,對ArrayList進行降序排列:

public static void descSort(List<HashMap<String,String>> list,String name){ 
    order = name;
    Collections.sort(list, new Comparator<HashMap<String,String>>(){
        public int compare(HashMap<String, String> arg0,HashMap<String, String> arg1) { 
            return arg1.get(order).compareTo( arg0.get(order));   //降序
        } 
    });
    order = null;
}

與1.1的差別只在return語句,arg0和arg1的先后順序弄贿。

1.3以HashMap中的多個值為索引春锋,對ArrayList進行升序排列:

public static void sort(List<HashMap<String,String>> list,String[] nameList){ 
    orderList = nameList;
    Collections.sort(list, new Comparator<HashMap<String,String>>(){
        public int compare(HashMap<String, String> arg0,HashMap<String, String> arg1) {
            int result = 0;
            for(int i = 0;i < orderList.length;i++){
                result = arg0.get(orderList[i]).compareTo(arg1.get(orderList[i]));
                if(result != 0){
                    break;
                }
            }
            return result; 
        } 
    });
    orderList = null;
}

降序的差別同樣只是arg0和arg1的先后順序。

1.4 使用方法舉例:

public static void main(String[] args) {
    String[] name = {"李雷","韓梅梅","莉莉","露西",};
    String[] age = {"30","24","26","26",};
    String[] weight = {"200","80","120","100",};
    String[] height = {"180","170","150","160",};
    ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
    for(int i = 0;i < 4;i ++){
        HashMap<String,String> map = new HashMap<String,String>();
        map.put("name", name[i]);
        map.put("age", age[i]);
        map.put("weight", weight[i]);
        map.put("height", height[i]);
        list.add(map);
    }
    My_Sort.sort(list, "name");  //按名字的ASCII碼升序
    My_Sort.descSort(list, "age");  //按年齡的大胁畎肌(ASCII碼)降序
    My_Sort.sort(list, new String[]{"age","weight"});   //優(yōu)先按年齡升序期奔,年齡相同按體重升序
}

2.自定義排序

2.1 假設(shè)1.4的例子侧馅,需要按年齡升序,年齡相同再按體重降序,體重相同再按身高升序呐萌,方法代碼如下:

/** 自定義排序馁痴,按照nameList的優(yōu)先順序,比較hashmap中的key排序
 * @param list
 * @param nameList 排序鍵值的優(yōu)先順序
 * @param typeList 對應值為1為降序,其他為升序
*/
public static void sortByCustom(List<HashMap<String,String>> list,String[] nameList,int[] typeList){ 
    if(nameList.length != typeList.length){
        return ;  //參數(shù)不匹配肺孤,不進行排序
    }
    orderList = nameList;
    orderTypeList = typeList;
    Collections.sort(list, new Comparator<HashMap<String,String>>(){
        public int compare(HashMap<String, String> arg0,HashMap<String, String> arg1) {
            int result = 0;
            for(int i = 0;i < orderList.length;i++){
                if(orderTypeList[i] == 1){
                    result = arg1.get(orderList[i]).compareTo(arg0.get(orderList[i]));
                }else{
                    result = arg0.get(orderList[i]).compareTo(arg1.get(orderList[i]));
                }
                if(result != 0){
                    break;
                }
            }
            return result; 
        } 
    });
    orderList = null;
    orderTypeList = null;
}

2.2 使用舉例罗晕。1.4中的例子用法如下:

//優(yōu)先按年齡升序,再按體重降序,再按身高升序
My_Sort.sortByCustom(list, new String[]{"age","weight","height"}赠堵,new int[]{0,1,0});

結(jié)束語

1.本文的排序規(guī)則只是比較字符串的ASCII碼小渊,如果需要更復雜的規(guī)則,重寫Comparator對象的compare()方法茫叭,本文已經(jīng)重寫四次酬屉,不再贅述。

2.在寫完2.2的new int[]{0,1,0} 后揍愁,有一種熟悉的感覺梆惯。想起來Android手機也是用{1,0,1,0}的數(shù)組來控制手機振動時間,無意中巧合吗垮,真是一種奇妙的感覺垛吗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市烁登,隨后出現(xiàn)的幾起案子怯屉,更是在濱河造成了極大的恐慌,老刑警劉巖饵沧,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锨络,死亡現(xiàn)場離奇詭異,居然都是意外死亡狼牺,警方通過查閱死者的電腦和手機羡儿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來是钥,“玉大人掠归,你說我怎么就攤上這事∏哪啵” “怎么了虏冻?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長弹囚。 經(jīng)常有香客問我厨相,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任蛮穿,我火速辦了婚禮庶骄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘践磅。我一直安慰自己瓢姻,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布音诈。 她就那樣靜靜地躺著幻碱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪细溅。 梳的紋絲不亂的頭發(fā)上褥傍,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音喇聊,去河邊找鬼恍风。 笑死,一個胖子當著我的面吹牛誓篱,可吹牛的內(nèi)容都是我干的朋贬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼窜骄,長吁一口氣:“原來是場噩夢啊……” “哼锦募!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邻遏,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤糠亩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后准验,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赎线,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年糊饱,在試婚紗的時候發(fā)現(xiàn)自己被綠了垂寥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡另锋,死狀恐怖滞项,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情砰蠢,我是刑警寧澤蓖扑,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布唉铜,位于F島的核電站台舱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜竞惋,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一柜去、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拆宛,春花似錦嗓奢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钳幅,卻和暖如春物蝙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背敢艰。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工诬乞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钠导。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓震嫉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親牡属。 傳聞我的和親對象是個殘疾皇子票堵,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359