欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java中List的排序问题

程序员文章站 2024-02-08 18:18:46
...

在完成软件构造lab3时,实现MultiInterSet类需要对每一个标签对应的时间段列表进行从小到大的排序:

即已有一个Interval类,每一个Interval对应一个时间段[a, b]。在MultiIntervalSet类中声明一个时间段的列表List< Interval > l = new ArrayList<>();然后对 l 中的每个时间段,按照其起始时间的升序进行排列,如排序前该列表为 [20, 35], [10, 25],[0, 30],排序后应为 [0, 30], [10, 25], [20, 35]

方法一:通过实现Comparable接口实现排序

该方法应该是普遍和常用的方法之一了,即通过Interval类来实现Comparable这个Java中提供的接口,重写其中的compareTo方法来设定排序的规则,进而对Interval类的列表进行排序

首先需要使Interval类来实现Comparable接口:

class Interval implements Comparable<Interval>

重写compareTo方法:

@Override
public int compareTo(Interval i) {
	return this.getStart() - i.getStart();
}

其中getStart为Interval类中定义的方法,作用为返回这个时间段的开始时间

this.getStart - i.getstart实现对其升序的比较

测试代码:

public static void main(String[] args) {
	List<Interval> l = new ArrayList<>();
	l.add(new Interval(20, 30));
	l.add(new Interval(0, 10));
	l.add(new Interval(5, 25));
	System.out.println("Before sort: " + l.toString());
	l.sort(null);
	System.out.println("Afer sort: " + l.toString());
}

运行结果如下:

Before sort: [Interval [start=20, end=30], Interval [start=0, end=10], Interval [start=5, end=25]]
Afer sort: [Interval [start=0, end=10], Interval [start=5, end=25], Interval [start=20, end=30]]

方法二:利用Comparator类进行排序

比较器Comparator类也是java中的一个接口,其中包含有compare等方法,可以通过实现该接口并且实现compare方法来进行比较排序

public int compare(Interval i1, Interval i2){
    int temp = i1.getStart() - i2.getStart();
    if(temp > 0)
        return 1;
    else if(temp < 0)
        return -1;
    else
        return 0;
}

排序时调用List的sort方法或者Collections类的sort方法

Collections.sort(list, new Comparator<Interval>)

方法三:重载Collections.sort

与方法二类似,可以通过直接重载Collections的sort方法实现排序