diff --git a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/Event.java b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/Event.java index 87b1194..4185d57 100644 --- a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/Event.java +++ b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/Event.java @@ -23,7 +23,7 @@ * Event is the container class for when a specific group of people are meeting and are therefore * busy. Events are considered read-only. */ -public final class Event { +public final class Event implements Comparable{ private final String title; private final TimeRange when; private final Set attendees = new HashSet<>(); @@ -75,6 +75,9 @@ public Set getAttendees() { // internal data. return Collections.unmodifiableSet(attendees); } + public int compareTo(Event eventB) { + return this.getWhen().start() - eventB.getWhen().start(); + } @Override public int hashCode() { diff --git a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java index dadf069..0a44405 100644 --- a/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java +++ b/walkthroughs/week-5-tdd/project/src/main/java/com/google/sps/FindMeetingQuery.java @@ -14,10 +14,56 @@ package com.google.sps; -import java.util.Collection; +import java.util.*; +import java.lang.Math; public final class FindMeetingQuery { public Collection query(Collection events, MeetingRequest request) { - throw new UnsupportedOperationException("TODO: Implement this method."); + long duration = request.getDuration(); + ArrayList allEvents = new ArrayList(); + Set attendees = new HashSet(request.getAttendees()); + //Add all events that attendees go to + for (Event event : events) { + Set curAttendees = new HashSet(attendees); + curAttendees.retainAll(event.getAttendees()); + if (!(curAttendees.isEmpty())){ + allEvents.add(event); + } + } + Collections.sort(allEvents); + + ArrayList times = new ArrayList(); + int start = 0; + Boolean cont = false; + for (int i = 0; i < allEvents.size(); i++) { + TimeRange curTime = allEvents.get(i).getWhen(); + if (!cont) { + TimeRange curRange = TimeRange.fromStartEnd(start, curTime.start(), false); + if ((long) curRange.duration() >= request.getDuration()) { + times.add(curRange); + } + } + //If next event overlaps with current, make start the greater of the two events + if ((i != allEvents.size() - 1) && curTime.overlaps(allEvents.get(i+1).getWhen())) { + start = Math.max(curTime.end(), start); + cont = true; + } else { + //If it doesn't overlap check gap during next iteration + start = Math.max(curTime.end(), start); + cont = false; + } + //If last event check if end of day is a possible time + if (i == allEvents.size() - 1) { + TimeRange curRange = TimeRange.fromStartEnd(start, TimeRange.END_OF_DAY, true); + if ((long) curRange.duration() >= request.getDuration()) { + times.add(curRange); + } + + } + } + if (allEvents.size() == 0 && request.getDuration() <= TimeRange.END_OF_DAY) { + times.add(TimeRange.fromStartEnd(TimeRange.START_OF_DAY, TimeRange.END_OF_DAY, true)); + } + return times; } }