在單線程中吃既,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ù)組來控制手機振動時間,無意中巧合吗垮,真是一種奇妙的感覺垛吗。