首页 > 解决方案 > 如何使用具有 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());
       }
    }
}

标签: javaoop

解决方案


您的问题是公共类 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 让这类代码更简洁


推荐阅读