diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/MarkPassingByTimeComparator.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/MarkPassingByTimeComparator.java new file mode 100755 index 00000000000..d2ca3736940 --- /dev/null +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/MarkPassingByTimeComparator.java @@ -0,0 +1,29 @@ +package com.sap.sailing.domain.tracking.impl; + +import java.util.Comparator; + +import com.sap.sailing.domain.tracking.MarkPassing; + +/** + * Compares two {@link MarkPassing} objects, using their {@link MarkPassing#getTimePoint() time point} as the primary + * ordering criterion in ascending order. If two mark passings have equal time points, the competitor IDs' string + * representations are compared as the secondary ordering criterion to ensure that two competitors passing a mark at the + * same time are still identified as not being equal. + * + * @author Axel Uhl (D043530) + * + */ +public class MarkPassingByTimeComparator implements Comparator { + public static MarkPassingByTimeComparator INSTANCE = new MarkPassingByTimeComparator(); + + @Override + public int compare(MarkPassing o1, MarkPassing o2) { + int result = o1 == null ? o2 == null ? 0 : -1 : o2 == null ? 1 : o1.getTimePoint().compareTo(o2.getTimePoint()); + if (result == 0 && o1 != null) { + assert o2 != null; + result = o1.getCompetitor().getId().toString().compareTo(o2.getCompetitor().getId().toString()); + } + return result; + } + +} diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 9647fe60ded..935e6d2d9db 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -166,12 +166,12 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { markPassingsForCompetitor = new HashMap>(); tracks = new HashMap>(); for (Competitor competitor : race.getCompetitors()) { - markPassingsForCompetitor.put(competitor, new ConcurrentSkipListSet(TimedComparator.INSTANCE)); + markPassingsForCompetitor.put(competitor, new ConcurrentSkipListSet(MarkPassingByTimeComparator.INSTANCE)); tracks.put(competitor, new DynamicGPSFixMovingTrackImpl(competitor, millisecondsOverWhichToAverageSpeed)); } markPassingsForWaypoint = new HashMap>(); for (Waypoint waypoint : race.getCourse().getWaypoints()) { - markPassingsForWaypoint.put(waypoint, new ConcurrentSkipListSet(TimedComparator.INSTANCE)); + markPassingsForWaypoint.put(waypoint, new ConcurrentSkipListSet(MarkPassingByTimeComparator.INSTANCE)); } windTracks = new HashMap(); for (WindSource windSource : WindSource.values()) { @@ -548,7 +548,7 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { @Override public synchronized void waypointAdded(int zeroBasedIndex, Waypoint waypointThatGotAdded) { updateStartToNextMarkCacheInvalidationCacheListenersAfterWaypointAdded(zeroBasedIndex, waypointThatGotAdded); - markPassingsForWaypoint.put(waypointThatGotAdded, new ConcurrentSkipListSet(TimedComparator.INSTANCE)); + markPassingsForWaypoint.put(waypointThatGotAdded, new ConcurrentSkipListSet(MarkPassingByTimeComparator.INSTANCE)); for (Buoy buoy : waypointThatGotAdded.getBuoys()) { getOrCreateTrack(buoy); }