Как я могу использовать метод Collections.sort с 2 параметрами, чтобы отсортировать в порядке возрастания данный список в Java? - PullRequest
0 голосов
/ 19 июня 2020

Я создал класс Planificator, который позволит мне отсортировать элементы списка по дате окончания.

Затем я хотел бы удалить перекрывающиеся элементы.

В основном мой код поможет мне реализовать систему встреч.

Две встречи с датами начала в возрастающем порядке перекрываются, если дата начала второй встречи меньше или равна дате начала первой встречи.

Я вставил в свой код то, что было бы моим примером ожидаемого результата, чтобы все выглядело понятным.

Код работает в этом примере, но я думаю, что я использовал Collections.sort не хорошо, потому что это не сработает во всех случаях. Я получаю ошибки, если пытаюсь выполнить что-то вроде этого Collections.sort (meeting, 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());
       }
    }
}

1 Ответ

2 голосов
/ 19 июня 2020

Ваша проблема в том, что publi c class Compara должен быть классом stati c, чтобы вы могли создать его экземпляр в 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());

лямбда-выражения делают такой код намного чище

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...