java中List的排序问题
在完成软件构造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方法实现排序
上一篇: 软件构造课程Lab1实验报告
下一篇: http请求报文挂起案例