之前写的一篇博文直接使用Collections.sort()
对一个ArrayList
进行排序操作。这篇博文再加一点点进阶的操作,自定义排序规则
。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class T_00 {
public static void main(String[] args) {
ArrayList<Integer> a = new ArrayList<Integer>();
a.add(1);
a.add(3);
a.add(5);
a.add(2);
a.add(4);
for (int i = 0; i < a.size(); i++) {
System.out.println(a.get(i));
}
System.out.println("====================");
// 自定义排序规则,使其降序排列
Collections.sort(a, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if(o1>o2)
return -1;
else if(o1<o2)
return 1;
return 0;
};
});
for (int i = 0; i < a.size(); i++) {
System.out.println(a.get(i));
}
}
}
总结一下
使用Collections.sort(List,Comparator)
,可以自定义排序规则。首先我们需要实现Comparator
接口,重写public int compare(Object o1, Object o2)
方法。在这个方法中写下自定义的排序规则。
数据中有负数时,要注意数据的处理方式
还有一点就是,只能对集合类型
进行排序,对int数组
不能直接这样操作,要先转成集合类型
。
if(o1>o2)
return -1;
else if(o1<o2)
return 1;
return 0;
做个题,巩固下------拼接字符串产生的最小序列
参考解法
import java.util.*;
public class Test {
public String minString (String[] strs) {
// 这里如果直接使用数组进行冒泡排序,会超时
// 所以这里转换成ArrayList,并使用Collections.sort(list,Comparator);排序
ArrayList<String> list = new ArrayList<>();
for(String s:strs) list.add(s);
Collections.sort(list,new Comparator<String>(){
public int compare(String o1,String o2){
return (o1+o2).compareTo(o2+o1);
}
});
StringBuilder sb = new StringBuilder();
for(String s:list)
sb.append(s);
return sb.toString();
}
}
再来一个题------数组的合并
参考解法
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
import java.util.Collections;
import java.util.Comparator;
import java.util.ArrayList;
public class Solution {
public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
if (intervals.size() <= 1)
return intervals;
// 排序规则,升序排列,若左边界相等,则比较右边界
Collections.sort(intervals, new Comparator<Interval>() {
@Override
public int compare(Interval o1, Interval o2) {
if (o1.start == o2.start) {
return o1.end - o2.end;
} else {
return o1.start - o2.start;
}
}
});
ArrayList<Interval> res = new ArrayList<Interval>();
res.add(intervals.get(0));
for (int i = 1; i < intervals.size(); i++) {
if(res.get(res.size()-1).start==intervals.get(i).start) {
res.get(res.size()-1).end = Math.max(res.get(res.size()-1).end, intervals.get(i).end);
continue;
}
if(res.get(res.size()-1).end<intervals.get(i).start)
res.add(intervals.get(i));
else {
res.get(res.size()-1).end = Math.max(res.get(res.size()-1).end, intervals.get(i).end);
}
}
return res;
}
}