在做数组排成最小的数算法题时,对重写比较器进行了研究,现在进行总结。
题目https://www.nowcoder.com/practice/8fecd3f8ba334add803bf2a06af1b993?tpId=13&&tqId=11185&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
- 小根堆排序
https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/solution/mian-shi-ti-45-ba-shu-zu-pai-cheng-zui-xiao-de-s-4/492343
JAVA默认是从小到大排序!!!
Queue<String> queue = new PriorityQueue<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
//字典序列小的放在堆顶
return (o1 + o2).compareTo(o2 + o1);
}
});
需要注意的是,尽管是Comparator重写compare方法返回的是int,规则可以自定义,但是返回1说明不交换o1和o2,返回-1则交换。
- 重写Arrays.sort也可以
Arrays.sort(arr,new Comparator<String>(){
public int compare(String s1,String s2){
if((s1+s2).compareTo(s2+s1)>=0) return 1;
else return -1;
}
} );
- 使用lambda表达式重写 (由测试得知这一表达式会导致算法效率变慢!)
Arrays.sort(arr,(String s1,String s2)->{
//当接口只有一个抽象函数时,用->{}程序块代替定义
if((s1+s2).compareTo(s2+s1)>=0) return 1;
else return -1;
} );