在单线程中,ArryList和HashMap的查找速度是相当快的。
本人在工作中有利用ArryList<HashMap<String,String>>当作缓存中的数据库,今天写了排序功能,拿出来分享。
不足之处欢迎指正。
前言
我们在使用一般排序的时候,会使用Collections.sort(List<T>)方法,T为基本数据类型或String。
当List的参数为集合类或对象,或要实现自定义排序,就要使用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;
使用静态字段和方法。声明成员变量:
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"}); //优先按年龄升序,年龄相同按体重升序
}
2.自定义排序
2.1 假设1.4的例子,需要按年龄升序,年龄相同再按体重降序,体重相同再按身高升序,方法代码如下:
/** 自定义排序,按照nameList的优先顺序,比较hashmap中的key排序
* @param list
* @param nameList 排序键值的优先顺序
* @param typeList 对应值为1为降序,其他为升序
*/
public static void sortByCustom(List<HashMap<String,String>> list,String[] nameList,int[] typeList){
if(nameList.length != typeList.length){
return ; //参数不匹配,不进行排序
}
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中的例子用法如下:
//优先按年龄升序,再按体重降序,再按身高升序
My_Sort.sortByCustom(list, new String[]{"age","weight","height"},new int[]{0,1,0});
结束语
1.本文的排序规则只是比较字符串的ASCII码,如果需要更复杂的规则,重写Comparator对象的compare()方法,本文已经重写四次,不再赘述。
2.在写完2.2的new int[]{0,1,0} 后,有一种熟悉的感觉。想起来Android手机也是用{1,0,1,0}的数组来控制手机振动时间,无意中巧合,真是一种奇妙的感觉。
网友评论