java - 如何使用具有 2 个参数的 Collections.sort 方法以升序对 Java 中的给定列表进行排序?
问题描述
我创建了一个“Planificator”类,它允许我按结束日期对列表中的元素进行排序。
然后我想删除重叠的元素。
基本上我的代码将帮助我实现一个会议系统。
如果第二次会议的开始日期小于或等于第一次会议的开始日期,则开始日期按升序排列的两个会议重叠。
我已经在我的代码中放入了我的预期输出示例,以使事情看起来清晰。
该代码适用于该示例,但我认为我使用 Collections.sort 的方式并不好,因为它不适用于每种情况。如果我尝试这样的 Collections.sort(meetings ,new Compara()); 就会出错。
class Meeting implements Comparable<Meeting> {
private Calendar start, end;
public Meeting(Calendar start, Calendar end) {
if (start.compareTo(end) > 0)
throw new IllegalArgumentException("Invalid date");
this.start = start;
this.end = end;
}
public Calendar getStarted() {
return start;
}
public Calendar getEnding() {
return end;
}
public int compareTo(Meeting m) {
return this.start.compareTo(m.getStarted());
}
public String toString() {
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
return sdf.format(start.getTime()) + " -> " + sdf.format(end.getTime());
}
}
class Planificator {
public class Compara implements Comparator<Meeting> {
@Override
public int compare(Meeting o1, Meeting o2) {
return o1.getEnding().compareTo(o2.getEnding());
}
}
public static void planifica(List<Meeting> meetings) {
Collections.sort(meetings);
for (int i = 0; i < meetings.size() - 1; i++) {
if (meetings.get(i).getEnding().compareTo(meetings.get(i + 1).getStarted()) > 0) {
meetings.remove(i + 1);
--i;
}
}
}
}
public class Main {
public static void main(String[] args) throws Exception {
try {
List<Meeting> l = new ArrayList<>();
l.add(new Meeting(new GregorianCalendar(1,2,3), new GregorianCalendar(2,2,3)));
l.add(new Meeting(new GregorianCalendar(1, 2, 3), new GregorianCalendar(5, 2, 3)));
l.add(new Meeting(new GregorianCalendar(3, 2, 3), new GregorianCalendar(5, 2, 3)));
Planificator.plan(l);
System.out.println(l); // [03/03/0001 12:00:00 -> 03/03/0002 12:00:00, 03/03/0003 12:00:00 -> 03/03/0005 12:00:00]
} catch (IllegalArgumentException e) {
System.out.print(e.getMessage());
}
}
}
解决方案
您的问题是公共类 Compara需要是一个静态类,您才能在main()中实例化它,否则嵌套类期望有一个关联的实例。
您可以在此处阅读有关嵌套类和内部类的更多信息:https ://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
将其简单地编写为:
// inverted order or whatever you want
Collection.sort(meetings, (o1, o2) -> o2.getEnding().compareTo(o1.getEnding());
Lambda 让这类代码更简洁
推荐阅读
- c# - JRaw SelectToken 返回 null
- ionic-framework - 侧边菜单未在通过模式上的按钮打开的页面上打开
- erlang - 如何使用 OpenAPI 生成器中的 erlang-server 存根?
- python - 在python中列化循环输出
- reactjs - 关闭网络摄像头而不重新加载
- android - 由于插件冲突,构建cordova android时出错
- mongodb - MongoDB聚合-累积
- reactjs - 自定义输入字段未向后端提交数据
- javascript - jQuery自动完成正在呈现未过滤的数据
- ms-access - VBA获取具有包含列表框控件名称的字符串的值