根据java源代码,可以知道内部规定:
compare方法大于0,就把前一个数和后一个数交换,如果小于等于0就保持原位置,不进行交换。
/**
* NC37 合并区间
* 牛客网
*/
public class Main15 {
public static void main(String[] args) throws Exception {
Main15 main16 = new Main15();
ArrayList<Interval> listL = new ArrayList<Interval>();
/* listL.add(new Interval(3, 3));
listL.add(new Interval(2, 7));*/
listL.add(new Interval(2, 199));
listL.add(new Interval(2, 180));
ArrayList<Interval> merge = main16.merge(listL);
for (Interval i : merge) {
System.out.println(i.start + "\t" + i.end);
}
}
public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
if (intervals.size() == 0) {
return new ArrayList<>();
}
Collections.sort(intervals, new Comparator<Interval>() {
public int compare(Interval o1, Interval o2) {
if (o1.start != o2.start) {
return o1.start - o2.start;
} else {
return o1.end - o2.end;
}
}
});
System.out.println((intervals.get(0).start > intervals.get(1).start));
for (Interval interval : intervals) {
System.out.println(interval.start + "\t" + interval.end + "++++++++++++");
}
ArrayList<Interval> result = new ArrayList<>();
result.add(intervals.get(0));
int count = 0;
for (int i = 1; i < intervals.size(); i++) {
Interval o1 = intervals.get(i);
Interval origin = result.get(count);
if (o1.start > origin.end) {
System.out.println("从一开始的:o1-->"+o1.start+"\t"+o1.end);
System.out.println("count:origin-->"+origin.start+"\t"+origin.end);
result.add(o1);
count++;
} else {
System.out.println("else:从一开始的:o1-->"+o1.start+"\t"+o1.end);
System.out.println("else:count:origin-->"+origin.start+"\t"+origin.end);
System.out.println("删除"+result.get(count).start+"\t"+result.get(count).end);
result.remove(count);
Interval s = new Interval(origin.start, o1.end);
if (o1.end < origin.end) {
s.end = origin.end;
}
result.add(s);
}
}
return result;
}
}
Comparator使用
Collections.sort(Arraylist<className>,new Conparator(className){
public int compare(className o1,className o2){
if(o1.age!=o2.age){//意见不同开战
return o1.age-o2.age;
}else { //有两个维度比较
return o1.salary-o2.salary;
}
}
})
为什么o1.age-o2.age是升序?
为什么o1.salary-o2.salary也是升序?
//这里拿o1.age与o2.age说明
因为o1与o2是Arraylist<className>中的任意两个对象;
因此有:
o1.age>o2.age
o1.age<o2.age
o1.age=o2.age
因为设置if(o1.age!=o2.age),不考虑第三种情况;
当o1.age>o2.age
//关注交换位置
o1.age-o2.age>0
//升序
//大于零交换位置 o1.age o2.age ==>o2.age o1.age
o2.age-o1.age<0 //降序 //位置不变 o1.age o2.age
当o1.age<o2.age
//关注交换位置
o1.age-o2.age<0; //升序 //小于等于零不变o1.age o2.age 的位置
o2.age-o1.age>0;
//降序
// 大于零交换位置 o1.age o2.age ==>o2.age o1.age