From e8e4759a64cc79bb9a872e42d1d055d4cd62681b Mon Sep 17 00:00:00 2001 From: Nikolaus Krismer <nikolaus.krismer@uibk.ac.at> Date: Wed, 13 Aug 2014 12:51:02 +0200 Subject: [PATCH] now allowing multimap of links in node (each node can have multiple links to the same target node) -> fixes reachability problem with new getLatestDepartureTime/getEarliestArrivalTime sql queries --- .../inf/isochrone/network/NodeConnection.java | 78 +++++++++++++------ 1 file changed, 56 insertions(+), 22 deletions(-) diff --git a/src/main/java/it/unibz/inf/isochrone/network/NodeConnection.java b/src/main/java/it/unibz/inf/isochrone/network/NodeConnection.java index 02bb939c..66c43a5e 100644 --- a/src/main/java/it/unibz/inf/isochrone/network/NodeConnection.java +++ b/src/main/java/it/unibz/inf/isochrone/network/NodeConnection.java @@ -1,16 +1,16 @@ package it.unibz.inf.isochrone.network; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; public class NodeConnection { private final Node sourceNode; - private final Map<Node, Link> continuousTargetConnections; - private final Map<Node, Link> discreteTargetConnections; + private final Map<Node, Collection<Link>> continuousTargetConnections; + private final Map<Node, Collection<Link>> discreteTargetConnections; // Collections @@ -26,10 +26,14 @@ public class NodeConnection { return sourceNode; } - public Map<Node, Link> getContinuousTargets() { + public Map<Node, Collection<Link>> getContinuousTargets() { return continuousTargetConnections; } + public Collection<Integer> getContinuousRouteToTargetNode(final int nodeId) { + return getRoutesToTargetNode(continuousTargetConnections, nodeId); + } + public Node getContinuousTargetNode(final int nodeId) { return getNodeById(continuousTargetConnections, nodeId); } @@ -42,11 +46,7 @@ public class NodeConnection { return getIdsForTargetNodes(continuousTargetConnections); } - public Collection<Integer> getContiunousRouteIds() { - return getIdsForRoutes(continuousTargetConnections); - } - - public Map<Node, Link> getDiscreteTargets() { + public Map<Node, Collection<Link>> getDiscreteTargets() { return discreteTargetConnections; } @@ -62,8 +62,16 @@ public class NodeConnection { return getIdsForRoutes(discreteTargetConnections); } - public Map<Node, Link> getTargets() { - final Map<Node, Link> allTargets = new HashMap<>(); + public Collection<Integer> getDiscreteRouteToTargetNode(final int nodeId) { + return getRoutesToTargetNode(discreteTargetConnections, nodeId); + } + + public Collection<Integer> getRoutesToTargetNode(final int nodeId) { + return getRoutesToTargetNode(getTargets(), nodeId); + } + + public Map<Node, Collection<Link>> getTargets() { + final Map<Node, Collection<Link>> allTargets = new HashMap<>(); allTargets.putAll(continuousTargetConnections); allTargets.putAll(discreteTargetConnections); @@ -82,9 +90,9 @@ public class NodeConnection { public void addTargetLink(final Node targetNode, final Link link) { if (link.isContinuous()) { - continuousTargetConnections.put(targetNode, link); + addLinkForNode(continuousTargetConnections, targetNode, link); } else { - discreteTargetConnections.put(targetNode, link); + addLinkForNode(discreteTargetConnections, targetNode, link); } } @@ -100,30 +108,56 @@ public class NodeConnection { return !discreteTargetConnections.isEmpty(); } + @Override + public String toString() { + return "NodeConnection [sourceNode=" + sourceNode + "]"; + } + // Private static methods - private static Node getNodeById(final Map<Node, Link> map, final int nodeId) { - final Set<Entry<Node, Link>> entries = map.entrySet(); - for (final Entry<Node, Link> entry : entries) { - if (nodeId == entry.getKey().getId()) { - return entry.getKey(); + private static void addLinkForNode(final Map<Node, Collection<Link>> m, final Node node, final Link link) { + Collection<Link> c = m.get(node); + if (c == null) { + c = new ArrayList<>(); + } + + c.add(link); + m.put(node, c); + } + + private static Node getNodeById(final Map<Node, Collection<Link>> map, final int nodeId) { + final Set<Node> entries = map.keySet(); + for (final Node n : entries) { + if (nodeId == n.getId()) { + return n; } } return null; } - private static Collection<Integer> getIdsForRoutes(final Map<Node, Link> m) { - final Collection<Link> linkSet = m.values(); + private static Collection<Integer> getIdsForRoutes(final Map<Node, Collection<Link>> m) { + final Collection<Collection<Link>> linkSet = m.values(); + final Set<Integer> resultSet = new HashSet<>(linkSet.size()); + for (final Collection<Link> lCollection : linkSet) { + for (final Link l : lCollection) { + resultSet.add(l.getRoute()); + } + } + + return resultSet; + } + + private static Collection<Integer> getRoutesToTargetNode(final Map<Node, Collection<Link>> m, final int nodeId) { + final Collection<Link> linkSet = m.get(nodeId); final Set<Integer> resultSet = new HashSet<>(linkSet.size()); for (final Link l : linkSet) { resultSet.add(l.getRoute()); } - return resultSet; } - private static Collection<Integer> getIdsForTargetNodes(final Map<Node, Link> m) { + private static Collection<Integer> getIdsForTargetNodes(final Map<Node, Collection<Link>> m) { final Set<Node> nodeSet = m.keySet(); final Set<Integer> resultSet = new HashSet<>(nodeSet.size()); for (final Node n : nodeSet) { -- GitLab