diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 58ad3a5..a349c76 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -6,5 +6,10 @@ + + + \ No newline at end of file diff --git a/src/edu/kit/informatik/MainTest.java b/src/edu/kit/informatik/MainTest.java index be65b3e..04c4d95 100644 --- a/src/edu/kit/informatik/MainTest.java +++ b/src/edu/kit/informatik/MainTest.java @@ -109,12 +109,12 @@ class MainTest { } @Test - void newest_ilias_shit() throws IOException { + void newestIliasShit() throws IOException { cmpInOut("newest_ilias_shit_input.txt", "newest_ilias_shit_output.txt"); } @Test - void long_train() throws IOException { + void longTrain() throws IOException { cmpInOut("long_train_input.txt", "long_train_output.txt"); } diff --git a/src/edu/kit/informatik/model/Rail.java b/src/edu/kit/informatik/model/Rail.java index 0515cd2..29d7fe8 100644 --- a/src/edu/kit/informatik/model/Rail.java +++ b/src/edu/kit/informatik/model/Rail.java @@ -4,7 +4,7 @@ package edu.kit.informatik.model; * Generic rail that other rails can connect to. * * @author Arne Keller - * @version 1.0 + * @version 1.2 */ public abstract class Rail { /** @@ -16,7 +16,7 @@ public abstract class Rail { * Initialize a new rail with the specified identifier. * @param id the identifier of this rail */ - protected Rail(final int id) { + protected Rail(int id) { this.id = id; } @@ -27,6 +27,13 @@ public abstract class Rail { return this.id; } + /** + * Calculate the (Manhattan) length of this rail. + * + * @return the length of this rail + */ + public abstract long getLength(); + /** * @param point point to check for connection * @return whether the rail currently connects to the point @@ -45,20 +52,6 @@ public abstract class Rail { */ public abstract boolean canConnectToRail(Rail rail); - /** - * Try to set the rail to connect to this position. Obviously only makes sense for switches and similar rails. - * @param position point to connect to - * @return whether rail could be successfully set - */ - public boolean switchTo(Vector2D position) { - return false; - } - - /** - * @return whether the rail is ready for trains running on it - */ - public abstract boolean isReadyForTrains(); - /** * @param position the point to check * @return whether the point is inside this rail (not on the edge) @@ -72,7 +65,17 @@ public abstract class Rail { public abstract boolean canContain(Vector2D position); /** - * Get the direction trains can move on this rail starting at the specified position + * Try to set the rail to connect to this position. Obviously only makes sense for switches and similar rails. + * @param position point to connect to + * @return whether rail could be successfully set + */ + public boolean switchTo(Vector2D position) { + return false; + } + + /** + * Get the direction trains can move on this rail starting at the specified position. + * * @param position the position to check * @return the direction trains can move starting at that position */ @@ -80,8 +83,9 @@ public abstract class Rail { /** * Check whether this rail extends in the specified direction. + * * @param position start position - * @param direction the (normalized) direction to check + * @param direction the normalized direction vector to check * @return whether this rail can extend from that position in that direction */ public abstract boolean allowsDirectionFrom(Vector2D position, Vector2D direction); @@ -98,9 +102,7 @@ public abstract class Rail { public abstract Vector2D move(Vector2D position, Vector2D direction, long steps); /** - * Calculate the (Manhattan) length of this rail. - * - * @return the length of this rail + * @return whether the rail is ready for trains running on it */ - public abstract long getLength(); + public abstract boolean isReadyForTrains(); } diff --git a/src/edu/kit/informatik/model/RailwayNetwork.java b/src/edu/kit/informatik/model/RailwayNetwork.java index a2db194..017a684 100644 --- a/src/edu/kit/informatik/model/RailwayNetwork.java +++ b/src/edu/kit/informatik/model/RailwayNetwork.java @@ -11,6 +11,7 @@ import java.util.Optional; import java.util.Queue; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.IntStream; /** * A rail network consisting of tracks and switches. Is only concerned with rails, does not process trains. @@ -31,27 +32,27 @@ public class RailwayNetwork { * @return the positive identifier of the new track if successful, -1 if none available * @throws InvalidInputException if the user provides incorrect input */ - public int addTrack(final Vector2D start, final Vector2D end) throws InvalidInputException { + public int addTrack(Vector2D start, Vector2D end) throws InvalidInputException { if (start.distanceTo(end) == 0) { throw new InvalidInputException("track has length zero"); } - long startPossibleConnections = rails.values().stream().filter(rail -> rail.canConnectTo(start)).count(); - long endPossibleConnections = rails.values().stream().filter(rail -> rail.canConnectTo(end)).count(); + final long startPossibleConnections = rails.values().stream().filter(rail -> rail.canConnectTo(start)).count(); + final long endPossibleConnections = rails.values().stream().filter(rail -> rail.canConnectTo(end)).count(); if (startPossibleConnections == 2 || endPossibleConnections == 2) { throw new InvalidInputException("track would connect to two other rails"); } if (rails.isEmpty()) { - Track newTrack = new Track(start, end, 1); + final Track newTrack = new Track(start, end, 1); rails.put(1, newTrack); return newTrack.getIdentifier(); } else { - for (Rail rail : rails.values()) { + for (final Rail rail : rails.values()) { if (rail.canConnectTo(start) || rail.canConnectTo(end)) { - int id = getNextRailIdentifier(); + final int id = getNextRailIdentifier(); if (id < 0) { return -1; } - Track newTrack = new Track(start, end, id); + final Track newTrack = new Track(start, end, id); rails.put(id, newTrack); return newTrack.getIdentifier(); } @@ -68,28 +69,28 @@ public class RailwayNetwork { * @return the positive identifier of the switch if successful, -1 otherwise * @throws InvalidInputException when the new switch would be invalid */ - public int addSwitch(final Vector2D start, final Vector2D end1, final Vector2D end2) throws InvalidInputException { + public int addSwitch(Vector2D start, Vector2D end1, Vector2D end2) throws InvalidInputException { if (start.distanceTo(end1) == 0 || start.distanceTo(end2) == 0 || end1.distanceTo(end2) == 0) { throw new InvalidInputException("switch has length zero"); } if (rails.isEmpty()) { - Switch newSwitch = new Switch(start, end1, end2, 1); + final Switch newSwitch = new Switch(start, end1, end2, 1); rails.put(1, newSwitch); return newSwitch.getIdentifier(); } else { - long startPossibleConnections = rails.values().stream().filter(rail -> rail.canConnectTo(start)).count(); - long end1PossibleConnections = rails.values().stream().filter(rail -> rail.canConnectTo(end1)).count(); - long end2PossibleConnections = rails.values().stream().filter(rail -> rail.canConnectTo(end2)).count(); - if (startPossibleConnections == 2 || end1PossibleConnections == 2 || end2PossibleConnections == 2) { + final long startConnections = rails.values().stream().filter(rail -> rail.canConnectTo(start)).count(); + final long end1Connections = rails.values().stream().filter(rail -> rail.canConnectTo(end1)).count(); + final long end2Connections = rails.values().stream().filter(rail -> rail.canConnectTo(end2)).count(); + if (startConnections == 2 || end1Connections == 2 || end2Connections == 2) { throw new InvalidInputException("switch endpoint would connect to two other rails"); } if (rails.values().stream() .anyMatch(rail -> rail.canConnectTo(start) || rail.canConnectTo(end1) || rail.canConnectTo(end2))) { - int id = getNextRailIdentifier(); + final int id = getNextRailIdentifier(); if (id < 0) { return -1; } - Switch newSwitch = new Switch(start, end1, end2, id); + final Switch newSwitch = new Switch(start, end1, end2, id); rails.put(id, newSwitch); return newSwitch.getIdentifier(); } else { @@ -112,15 +113,15 @@ public class RailwayNetwork { * @param id identifier of the rail to remove * @return whether the rail could be successfully removed */ - public boolean removeRail(final int id) { - Rail toRemove = rails.get(id); + public boolean removeRail(int id) { + final Rail toRemove = rails.get(id); if (toRemove == null) { return false; } // locate one connected rail Rail otherRail = null; - for (Rail anotherRail : rails.values()) { + for (final Rail anotherRail : rails.values()) { if (anotherRail.getIdentifier() != id && anotherRail.canConnectToRail(toRemove)) { otherRail = anotherRail; break; @@ -134,16 +135,16 @@ public class RailwayNetwork { } // check that rails would still be connected after removing this rail - Set connectedRails = new HashSet<>(); + final Set connectedRails = new HashSet<>(); connectedRails.add(otherRail); - Queue toProcess = new LinkedList<>(); + final Queue toProcess = new LinkedList<>(); toProcess.add(otherRail); // basically breadth-first search, using a queue while (!toProcess.isEmpty()) { - Rail connected = toProcess.poll(); + final Rail connected = toProcess.poll(); - for (Rail other : rails.values()) { + for (final Rail other : rails.values()) { if (other != toRemove && !connectedRails.contains(other) && other.canConnectToRail(connected)) { connectedRails.add(other); toProcess.offer(other); @@ -166,7 +167,7 @@ public class RailwayNetwork { * @return whether the switch could be set */ public boolean setSwitch(final int id, final Vector2D position) { - Rail toSwitch = rails.get(id); + final Rail toSwitch = rails.get(id); if (toSwitch != null) { return toSwitch.switchTo(position); } @@ -187,12 +188,9 @@ public class RailwayNetwork { * @return the next positive rail identifier, or -1 if none available */ private int getNextRailIdentifier() { - for (int i = 1; i > 0; i++) { - if (!rails.containsKey(i)) { - return i; - } - } - return -1; + return IntStream.rangeClosed(1, Integer.MAX_VALUE) + .filter(id -> !rails.containsKey(id)) + .findFirst().orElse(-1); } /** @@ -204,13 +202,13 @@ public class RailwayNetwork { * @return next position, null if off the rails after single step */ public Vector2D move(Vector2D position, Vector2D direction, long steps) { - Rail containingRail = findContainingRail(position); + final Rail containingRail = findContainingRail(position); if (containingRail != null) { return containingRail.move(position, direction, steps); } - Rail[] touchingRails = findTouchingRails(position); - Vector2D nextPossiblePosition = position.add(direction); - Rail possibleContainingRail = findRailPotentiallyContaining(nextPossiblePosition); + final Rail[] touchingRails = findTouchingRails(position); + final Vector2D nextPossiblePosition = position.add(direction); + final Rail possibleContainingRail = findRailPotentiallyContaining(nextPossiblePosition); if (possibleContainingRail != null && !possibleContainingRail.contains(position.subtract(direction))) { return possibleContainingRail.move(position, direction, steps); @@ -220,15 +218,15 @@ public class RailwayNetwork { } else if (touchingRails.length == 1) { return touchingRails[0].move(position, direction, 1); } - Vector2D onRailOne = touchingRails[0].move(position, new Vector2D(direction), steps); - Vector2D onRailTwo = touchingRails[1].move(position, new Vector2D(direction), steps); + final Vector2D onRailOne = touchingRails[0].move(position, new Vector2D(direction), steps); + final Vector2D onRailTwo = touchingRails[1].move(position, new Vector2D(direction), steps); if (position.equals(onRailOne) || onRailOne == null) { // we are moving on rail two - Vector2D newDirection = touchingRails[1].getDirectionFrom(position); + final Vector2D newDirection = touchingRails[1].getDirectionFrom(position); direction.copyFrom(newDirection); return onRailTwo; } else if (position.equals(onRailTwo) || onRailTwo == null) { - Vector2D newDirection = touchingRails[0].getDirectionFrom(position); + final Vector2D newDirection = touchingRails[0].getDirectionFrom(position); direction.copyFrom(newDirection); return onRailOne; } else { diff --git a/src/edu/kit/informatik/model/RollingStock.java b/src/edu/kit/informatik/model/RollingStock.java index cd555f3..125846b 100644 --- a/src/edu/kit/informatik/model/RollingStock.java +++ b/src/edu/kit/informatik/model/RollingStock.java @@ -30,8 +30,7 @@ public abstract class RollingStock { * @param couplingBack whether this rolling stock should have a back coupling * @throws InvalidInputException on invalid user input (e.g. zero-sized coach) */ - protected RollingStock(final int length, final boolean couplingFront, final boolean couplingBack) - throws InvalidInputException { + protected RollingStock(int length, boolean couplingFront, boolean couplingBack) throws InvalidInputException { if (length < 1) { throw new InvalidInputException("rolling stock length has to be positive"); } diff --git a/src/edu/kit/informatik/model/SteamEngine.java b/src/edu/kit/informatik/model/SteamEngine.java index a724034..fd1bb0d 100644 --- a/src/edu/kit/informatik/model/SteamEngine.java +++ b/src/edu/kit/informatik/model/SteamEngine.java @@ -30,8 +30,8 @@ public class SteamEngine extends Engine { * @param couplingBack whether the engine should have a back coupling * @throws InvalidInputException on invalid user input (e.g. zero-sized engine) */ - public SteamEngine(final String series, final String name, final int length, - final boolean couplingFront, final boolean couplingBack) throws InvalidInputException { + public SteamEngine(String series, String name, int length, boolean couplingFront, boolean couplingBack) + throws InvalidInputException { super(series, name, length, couplingFront, couplingBack); } diff --git a/src/edu/kit/informatik/model/Switch.java b/src/edu/kit/informatik/model/Switch.java index f2e30c2..a02ad87 100644 --- a/src/edu/kit/informatik/model/Switch.java +++ b/src/edu/kit/informatik/model/Switch.java @@ -5,7 +5,7 @@ import edu.kit.informatik.ui.InvalidInputException; import java.util.Objects; /** - * A switch in the rail network. It connects a start position to two other positions. + * A switch in the rail network. It connects a start position to one of two other positions. * * @author Arne Keller * @version 1.0 @@ -26,20 +26,15 @@ public final class Switch extends Rail { /** * Construct a new switch. + * * @param start start position * @param end1 end position 1 * @param end2 end position 2 * @param id identifier of this switch * @throws InvalidInputException if the switch is not composed of straight lines */ - public Switch(final Vector2D start, final Vector2D end1, final Vector2D end2, final int id) - throws InvalidInputException { + public Switch(Vector2D start, Vector2D end1, Vector2D end2, int id) throws InvalidInputException { super(id); - if (start.getX() != end1.getX() && start.getY() != end1.getY() - || start.getX() != end2.getX() && start.getY() != end2.getY()) { - throw new InvalidInputException("start has to be connected in straight lines to end positions!"); - } - // make sure caller can not modify internal state after calling this.positionOne = new Track(start, end1, -1); this.positionTwo = new Track(start, end2, -1); } @@ -122,8 +117,8 @@ public final class Switch extends Rail { @Override public String toString() { if (selection == null) { - return String.format("s %d %s -> %s,%s", getIdentifier(), positionOne.getStart(), - positionOne.getEnd(), positionTwo.getEnd()); + return String.format("s %d %s -> %s,%s", getIdentifier(), + positionOne.getStart(), positionOne.getEnd(), positionTwo.getEnd()); } else { return String.format("s %d %s -> %s,%s %d", getIdentifier(), positionOne.getStart(), positionOne.getEnd(), positionTwo.getEnd(), getLength()); @@ -131,7 +126,7 @@ public final class Switch extends Rail { } @Override - public boolean equals(final Object obj) { + public boolean equals(Object obj) { if (obj != null && getClass().equals(obj.getClass())) { final Switch otherSwitch = (Switch) obj; diff --git a/src/edu/kit/informatik/model/Track.java b/src/edu/kit/informatik/model/Track.java index feff003..ac6c0d9 100644 --- a/src/edu/kit/informatik/model/Track.java +++ b/src/edu/kit/informatik/model/Track.java @@ -62,14 +62,14 @@ public final class Track extends Rail { return false; } if (start.getX() == end.getX() && position.getX() == start.getX()) { - int startY = start.getY(); - int endY = end.getY(); - int positionY = position.getY(); + long startY = start.getY(); + long endY = end.getY(); + long positionY = position.getY(); return startY < positionY && positionY < endY || startY > positionY && positionY > endY; } else if (start.getY() == end.getY() && position.getY() == start.getY()) { - int startX = start.getX(); - int endX = end.getX(); - int positionX = position.getX(); + long startX = start.getX(); + long endX = end.getX(); + long positionX = position.getX(); return startX < positionX && positionX < endX || startX > positionX && positionX > endX; } return false; @@ -103,11 +103,11 @@ public final class Track extends Rail { public Vector2D getDirectionFrom(Vector2D position) { // have to use long arithmetic here to avoid overflows if (start.equals(position)) { - return new Vector2D(Long.signum((long) end.getX() - (long) start.getX()), - Long.signum((long) end.getY() - (long) start.getY())); + return new Vector2D(Long.signum(end.getX() - start.getX()), + Long.signum(end.getY() - start.getY())); } else if (end.equals(position)) { - return new Vector2D(Long.signum((long) start.getX() - (long) end.getX()), - Long.signum((long) start.getY() - (long) end.getY())); + return new Vector2D(Long.signum(start.getX() - end.getX()), + Long.signum(start.getY() - end.getY())); } else { // in the middle of track, simply return direction from start return getDirectionFrom(start); diff --git a/src/edu/kit/informatik/model/Train.java b/src/edu/kit/informatik/model/Train.java index b2ff462..dab5753 100644 --- a/src/edu/kit/informatik/model/Train.java +++ b/src/edu/kit/informatik/model/Train.java @@ -40,10 +40,11 @@ public final class Train { /** * Construct a new train. + * * @param identifier identifier to use * @param rollingStock initial rolling stock */ - public Train(final int identifier, final RollingStock rollingStock) { + public Train(int identifier, RollingStock rollingStock) { this.identifier = identifier; this.rollingStocks.add(rollingStock); } @@ -69,7 +70,7 @@ public final class Train { * @throws InvalidInputException if the rolling stock could not be added to the train */ public void add(RollingStock rollingStock) throws InvalidInputException { - RollingStock last = rollingStocks.get(rollingStocks.size() - 1); + final RollingStock last = rollingStocks.get(rollingStocks.size() - 1); if (rollingStock.hasCouplingFront() && last.hasCouplingBack() && rollingStock.canCoupleTo(last) && last.canCoupleTo(rollingStock)) { rollingStocks.add(rollingStock); @@ -80,8 +81,8 @@ public final class Train { @Override public String toString() { - StringBuilder stringBuilder = new StringBuilder(Integer.toString(getIdentifier())); - for (RollingStock rollingStock : rollingStocks) { + final StringBuilder stringBuilder = new StringBuilder(Integer.toString(getIdentifier())); + for (final RollingStock rollingStock : rollingStocks) { stringBuilder.append(' '); stringBuilder.append(rollingStock.getIdentifier()); } @@ -94,15 +95,15 @@ public final class Train { * @return rows of ASCII art */ public List show() { - List lines = new ArrayList<>(); - for (RollingStock rollingStock : rollingStocks) { - for (StringBuilder line : lines) { + final List lines = new ArrayList<>(); + for (final RollingStock rollingStock : rollingStocks) { + for (final StringBuilder line : lines) { line.append(' '); } - String[] text = rollingStock.textRepresentation(); - int currentLength = lines.stream().mapToInt(StringBuilder::length).max().orElse(0); + final String[] text = rollingStock.textRepresentation(); + final int currentLength = lines.stream().mapToInt(StringBuilder::length).max().orElse(0); while (lines.size() < text.length) { - StringBuilder line = new StringBuilder(); + final StringBuilder line = new StringBuilder(); for (int i = 0; i < currentLength; i++) { line.append(' '); } @@ -111,8 +112,8 @@ public final class Train { for (int i = 0; i < text.length; i++) { lines.get(lines.size() - 1 - i).append(text[text.length - 1 - i]); } - int finalLength = lines.stream().mapToInt(StringBuilder::length).max().getAsInt(); - for (StringBuilder line : lines) { + final int finalLength = lines.stream().mapToInt(StringBuilder::length).max().getAsInt(); + for (final StringBuilder line : lines) { while (line.length() < finalLength) { line.append(' '); } @@ -127,7 +128,7 @@ public final class Train { * @param rail the rail to check * @return whether this train is on that rail */ - public boolean isOnRail(final Rail rail) { + public boolean isOnRail(Rail rail) { return isPlaced() && (occupiedRails.stream().anyMatch(blockedRail -> blockedRail == rail) || positions.stream().anyMatch(rail::canConnectTo)); } @@ -180,7 +181,8 @@ public final class Train { if (occupiedRailsSet.contains(occupiedRail) && positionList.size() >= 4) { // perhaps a self intersection final long occupiedAtFrontOfTrain = positionList.get(0).distanceTo(positionList.get(1)); - final long occupiedAtBackOfTrain = positionList.getLast().distanceTo(positionList.get(positionList.size() - 2)); + final long occupiedAtBackOfTrain = positionList.getLast() + .distanceTo(positionList.get(positionList.size() - 2)); if (occupiedAtFrontOfTrain + occupiedAtBackOfTrain > occupiedRail.getLength()) { // train definitely intersects itself return false; @@ -246,7 +248,10 @@ public final class Train { } /** - * @return a set of the rails this train occupies currently + * Get the rails this train currently occupies a non-empty part of. Simply touching a point of another rail will + * not include that rail in this set. + * + * @return a set of the rails this train occupies */ public Set getOccupiedRails() { // make sure caller can not modify internal state @@ -301,8 +306,10 @@ public final class Train { if (backPosition != null) { // not derailing positions.addLast(new Vector2D(backPosition)); - if (positions.size() >= 3 && backPosition.subtract(positions.get(positions.size() - 2)).normalized() - .equals(positions.get(positions.size() - 2).subtract(positions.get(positions.size() - 3)).normalized()) + if (positions.size() >= 3 + && backPosition.subtract(positions.get(positions.size() - 2)).normalized() + .equals(positions.get(positions.size() - 2) + .subtract(positions.get(positions.size() - 3)).normalized()) && railNetwork.findTouchingRails(positions.get(positions.size() - 2)).length == 0) { positions.remove(positions.size() - 2); } @@ -319,11 +326,13 @@ public final class Train { } /** - * Check whether this train touches another train. It is considered touching if two trains are behind each other. + * Check whether this train touches another train. + * Two trains ends occupying the same point is also considered touching. + * * @param other other train * @return whether this train touches the other train */ - public boolean touches(final Train other) { + public boolean touches(Train other) { return positions != null && other.isOnAnyPosition(positions); } @@ -333,7 +342,7 @@ public final class Train { * @param point position to check * @return whether this train is on the specified position */ - public boolean isOnPosition(final Vector2D point) { + public boolean isOnPosition(Vector2D point) { return positions.contains(point); } diff --git a/src/edu/kit/informatik/model/TrainManager.java b/src/edu/kit/informatik/model/TrainManager.java index becf6d0..73a458e 100644 --- a/src/edu/kit/informatik/model/TrainManager.java +++ b/src/edu/kit/informatik/model/TrainManager.java @@ -245,8 +245,9 @@ public final class TrainManager { */ private void addToSetOrAddNew(List> setList, Set newSet) { Set existing = null; - for (int i = 0; i < setList.size(); i++) { - Set otherSet = setList.get(i); + int i = 0; + while (i < setList.size()) { + final Set otherSet = setList.get(i); if (otherSet.stream().anyMatch(newSet::contains)) { if (existing == null) { existing = otherSet; @@ -254,9 +255,10 @@ public final class TrainManager { } else { existing.addAll(otherSet); setList.remove(i); - i--; + continue; } } + i++; } if (existing == null) { setList.add(newSet); diff --git a/src/edu/kit/informatik/model/TrainSet.java b/src/edu/kit/informatik/model/TrainSet.java index 72074e9..e610e75 100644 --- a/src/edu/kit/informatik/model/TrainSet.java +++ b/src/edu/kit/informatik/model/TrainSet.java @@ -41,8 +41,8 @@ public class TrainSet extends RollingStock { * @param couplingBack whether the train set should have a back coupling * @throws InvalidInputException on invalid user input (e.g. zero-sized train set) */ - public TrainSet(final String series, final String name, final int length, - final boolean couplingFront, final boolean couplingBack) throws InvalidInputException { + public TrainSet(String series, String name, int length, boolean couplingFront, boolean couplingBack) + throws InvalidInputException { super(length, couplingFront, couplingBack); this.name = name; this.series = series; diff --git a/src/edu/kit/informatik/model/Vector2D.java b/src/edu/kit/informatik/model/Vector2D.java index ec6fdad..5a3e2c3 100644 --- a/src/edu/kit/informatik/model/Vector2D.java +++ b/src/edu/kit/informatik/model/Vector2D.java @@ -42,9 +42,9 @@ public class Vector2D { * @return a vector containing the two numbers, null otherwise */ public static Vector2D parse(final String input) { - String[] coordinates = input.split(",", 2); - int x = Integer.parseInt(coordinates[0]); - int y = Integer.parseInt(coordinates[1]); + final String[] coordinates = input.split(",", 2); + final int x = Integer.parseInt(coordinates[0]); + final int y = Integer.parseInt(coordinates[1]); return new Vector2D(x, y); } @@ -97,7 +97,6 @@ public class Vector2D { * Subtract another vector from this one, modifying this vector. * * @param other another vector - * @throws NullPointerException if other is null */ public void subtractInPlace(Vector2D other) { x -= other.x; @@ -111,60 +110,35 @@ public class Vector2D { public Vector2D add(Vector2D movement) { return new Vector2D(x + movement.x, y + movement.y); } - + + /** + * Calculate multiplier * this, and return a new vector. + * + * @param multiplier any scalar + * @return scaled vector + */ public Vector2D scale(long multiplier) { return new Vector2D(x * multiplier, y * multiplier); } /** - * @return the first component of this vector, casted to an int + * @return the first component of this vector */ - public int getX() { - return (int) x; - } - - /** - * - * @return - */ - public long getLongX() { + public long getX() { return x; } /** - * @return the second component of this vector, casted to an int + * @return the second component of this vector */ - public int getY() { - return (int) y; - } - - /** - * - * @return - */ - public long getLongY() { + public long getY() { return y; } /** - * Change the value of the first component of the vector - * @param x value to change to - */ - public void setX(final int x) { - this.x = x; - } - - /** - * Change the value of the second component of the vector - * @param y value to change to - */ - public void setY(final int y) { - this.y = y; - } - - /** - * - * @param other + * Copy another vectors' components into this one. + * + * @param other vector to copy data from */ public void copyFrom(Vector2D other) { this.x = other.x; @@ -172,9 +146,9 @@ public class Vector2D { } @Override - public boolean equals(final Object obj) { + public boolean equals(Object obj) { if (obj != null && getClass().equals(obj.getClass())) { - Vector2D point = (Vector2D) obj; + final Vector2D point = (Vector2D) obj; return x == point.x && y == point.y; } diff --git a/src/edu/kit/informatik/ui/InvalidInputException.java b/src/edu/kit/informatik/ui/InvalidInputException.java index ee11fe1..96a8b53 100644 --- a/src/edu/kit/informatik/ui/InvalidInputException.java +++ b/src/edu/kit/informatik/ui/InvalidInputException.java @@ -11,7 +11,7 @@ public class InvalidInputException extends Exception { * Construct a new invalid input exception with a specific message. * @param message the error message */ - public InvalidInputException(final String message) { + public InvalidInputException(String message) { super(message); } } diff --git a/testcoverage_output.txt b/testcoverage_output.txt index d5d5eac..d215d12 100644 --- a/testcoverage_output.txt +++ b/testcoverage_output.txt @@ -106,8 +106,8 @@ OK OK Crash of train 2 Crash of train 3,4,5 -Error, start has to be connected in straight lines to end positions! -Error, start has to be connected in straight lines to end positions! +Error, invalid track segment: not a straight line +Error, invalid track segment: not a straight line Error, invalid add switch argument syntax Error, invalid/missing delete track argument Error, too many arguments for list tracks