From 56e134b75e5ff847a520f8ffe9985f92fface1f6 Mon Sep 17 00:00:00 2001 From: Michael Aspinwall Date: Mon, 15 Jun 2020 21:23:38 +0000 Subject: [PATCH 1/3] Add initial algorithm for calendar, most tests pass but working on 2 more --- .../src/main/java/com/google/sps/Event.java | 5 +- .../java/com/google/sps/FindMeetingQuery.java | 48 ++++++++++++++++++- 2 files changed, 50 insertions(+), 3 deletions(-) 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..88d49c8 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,54 @@ package com.google.sps; -import java.util.Collection; +import java.util.*; 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()); + 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 ((i != allEvents.size() - 1) && curTime.overlaps(allEvents.get(i+1).getWhen())) { + cont = true; + } else { + start = curTime.end(); + cont = false; + } + + if (i == allEvents.size() - 1) { + TimeRange curRange = TimeRange.fromStartEnd(start, 1440, false); + if ((long) curRange.duration() >= request.getDuration()) { + times.add(curRange); + } + + } + } + if (allEvents.size() == 0) { + times.add(TimeRange.fromStartEnd(0, 1440, false)); + } + return times; } + + } From 4472f20f67b557962ecdca632c6e8d9a3bc40d08 Mon Sep 17 00:00:00 2001 From: Michael Aspinwall Date: Mon, 15 Jun 2020 22:13:50 +0000 Subject: [PATCH 2/3] Add a maximizing function for nested times --- .../src/main/java/com/google/sps/FindMeetingQuery.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 88d49c8..5e44584 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 @@ -15,6 +15,7 @@ package com.google.sps; import java.util.*; +import java.lang.Math; public final class FindMeetingQuery { public Collection query(Collection events, MeetingRequest request) { @@ -43,9 +44,10 @@ public Collection query(Collection events, MeetingRequest requ } if ((i != allEvents.size() - 1) && curTime.overlaps(allEvents.get(i+1).getWhen())) { + start = Math.max(curTime.end(), start); cont = true; } else { - start = curTime.end(); + start = Math.max(curTime.end(), start); cont = false; } @@ -57,7 +59,7 @@ public Collection query(Collection events, MeetingRequest requ } } - if (allEvents.size() == 0) { + if (allEvents.size() == 0 && request.getDuration() <= 1440) { times.add(TimeRange.fromStartEnd(0, 1440, false)); } return times; From 31773a40f7f3ccc89ca269cec8fefeb5852556d9 Mon Sep 17 00:00:00 2001 From: Michael Aspinwall Date: Tue, 16 Jun 2020 17:14:03 +0000 Subject: [PATCH 3/3] Remove magic numbers and add comments --- .../main/java/com/google/sps/FindMeetingQuery.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) 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 5e44584..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 @@ -22,6 +22,7 @@ public Collection query(Collection events, MeetingRequest requ 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()); @@ -41,29 +42,28 @@ public Collection query(Collection events, MeetingRequest requ 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, 1440, false); + 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() <= 1440) { - times.add(TimeRange.fromStartEnd(0, 1440, false)); + 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; } - - }