Я создал класс 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());
}
}
}