前言
在工作之中排序处理基本是sql语句处理,但是偶尔还是会有需要处理排序的情况,之前练习算法题的时候也遇到过这个问题。所以这里做一下总结归纳。
集合对象排序问题
使用Java的 Comparable 和 Comparator进行排序
Comparable
Collections.sort(list);
// 在对象内部定义排序规则
@Override
public int compareTo(Person p) {
// 年龄从大到小
return p.getAge() - this.getAge();
}
Comparator
// 使用 Comparator 比较器排序
Collections.sort(list, new PersonComparator());
/**
* 新建 Person 比较器
*/
class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p2.getAge() - p1.getAge();
}
}
Java流处理
sorted是java流处理排序方法。
list = list.stream().sorted(Comparator.comparing(Person::getAge).reversed())
.collect(Collectors.toList());
// 存在null值情况
list = list.stream().sorted(Comparator.comparing(Person::getAge,
Comparator.nullsFirst(Integer::compareTo)))
.collect(Collectors.toList());
Map/TreeMap排序问题
compareTo(String str) :是String 提供的一个方法,如果参数字符串等于此字符串,
则返回 0 值;如果按字典顺序此字符串小于字符串参数,则返回一个小于 0 的值;
如果按字典顺序此字符串大于字符串参数,则返回一个大于 0 的值。
int compare(T o1,T o2):随第一个参数小于、等于或大于第二个参数而分别返回负整数、零或正整数。
TreeMap hm = new TreeMap<String, String>(new Comparator() {
public int compare(Object o1, Object o2) {
//如果有空值,直接返回0
if (o1 == null || o2 == null)
return 0;
return String.valueOf(o1).compareTo(String.valueOf(o2));
}
});
存在中文比较情况
TreeMap hm = new TreeMap<String, String>(new Comparator() {
public int compare(Object o1, Object o2) {
//如果有空值,直接返回0
if (o1 == null || o2 == null)
return 0;
CollationKey ck1 = collator.getCollationKey(String.valueOf(o1));
CollationKey ck2 = collator.getCollationKey(String.valueOf(o2));
return ck1.compareTo(ck2);
}
});