首先先看下Java中的Collections.sort()排序方法:
Collections是一个工具类,sort是其中的静态方法,是用来对List类型进行排序的,它有两种参数形式:
代码语言:javascript复制 public static <T extends Comparable<? super T>> void sort(List<T> list) {
list.sort(null);
}
代码语言:javascript复制 public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
通过实现Comparator接口的compare方法来完成自定义排序
Comparator 的使用有两种方式:
Collections.sort(list,Comparator<T>);
list.sort(Comparator<T>);
其实主要是看 Comparator 接口的实现,重写里面的 compare 方法。代码如下:
代码语言:javascript复制//自定义排序1
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getId() - o2.getId();
}
});
compare(Student o1, Student o2) 方法的返回值跟 Comparable<> 接口中的 compareTo(Student o) 方法 返回值意思相同。另一种写法如下:
代码语言:javascript复制//自定义排序2
list.sort(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getId() - o2.getId();
}
});
根据Map<key, val>中的key排序map,排序完成后放进linkedHashMap中,也可以放在List<对象>中,因为map的话,返回到前端顺序会乱。
代码语言:javascript复制 /**
* 按key排序(sort by key).
*
* @param oriMap 要排序的map集合
* @param isAsc(true:升序,false:降序)
* @return
*/
private Map<String, Long> sortMapByKey(Map<String, Long> oriMap, final boolean isAsc) {
Map<String, Long> sortedMap = new LinkedHashMap<String, Long>();
if (oriMap != null && !oriMap.isEmpty()) {
List<Map.Entry<String, Long>> entryList = new ArrayList<Map.Entry<String, Long>>(oriMap.entrySet());
Collections.sort(entryList,
new Comparator<Map.Entry<String, Long>>() {
public int compare(Entry<String, Long> entry1,
Entry<String, Long> entry2) {
String key1 = entry1.getKey();
String key2 = entry2.getKey();
// 判定
int rst = 0;
if (isAsc) {
rst = key1.compareTo(key2);
} else {
rst = key2.compareTo(key1);
}
return rst; //1大于;0等于;-1小于
}
});
Iterator<Map.Entry<String, Long>> iter = entryList.iterator();
Map.Entry<String, Long> tmpEntry = null;
while (iter.hasNext()) {
tmpEntry = iter.next();
sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
}
}
return sortedMap;
}
根据val排序
代码语言:javascript复制 /**
* 按值排序(sort by value).
*
* @param oriMap 要排序的map集合
* @param isAsc(true:升序,false:降序)
* @return
*/
private Map<String, Long> sortMapByValueLong(Map<String, Long> oriMap, final boolean isAsc) {
Map<String, Long> sortedMap = new LinkedHashMap<String, Long>();
if (oriMap != null && !oriMap.isEmpty()) {
List<Map.Entry<String, Long>> entryList = new ArrayList<Map.Entry<String, Long>>(oriMap.entrySet());
Collections.sort(entryList,
new Comparator<Map.Entry<String, Long>>() {
public int compare(Entry<String, Long> entry1,
Entry<String, Long> entry2) {
long value1 = 0, value2 = 0;
try {
value1 = entry1.getValue();
value2 = entry2.getValue();
} catch (NumberFormatException e) {
value1 = 0;
value2 = 0;
}
// 判定
long rst = 0;
if (isAsc) {
rst = value1 - value2;
} else {
rst = value2 - value1;
}
return (int)rst;
}
});
Iterator<Map.Entry<String, Long>> iter = entryList.iterator();
Map.Entry<String, Long> tmpEntry = null;
while (iter.hasNext()) {
tmpEntry = iter.next();
sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
}
}
return sortedMap;
}