Java中Comparator使用

文章展示了一段Java代码,用于合并和排序区间(Interval)对象。代码首先通过自定义Comparator进行区间排序,然后遍历排序后的区间列表,合并重叠的区间。在比较过程中,如果开始时间不同,则按开始时间升序排列;如果开始时间相同,则按结束时间升序排列。
摘要由CSDN通过智能技术生成

根据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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有爪子的CAT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值