org.bbottema.javareflection.util.graph.NodePathComparator Maven / Gradle / Ivy
package org.bbottema.javareflection.util.graph;
import java.util.Comparator;
import java.util.List;
import static org.bbottema.javareflection.util.MiscUtil.trustedCast;
class NodePathComparator implements Comparator>> {
private static final NodePathComparator> INSTANCE = new NodePathComparator<>();
static NodePathComparator INSTANCE() {
return trustedCast(INSTANCE);
}
private NodePathComparator() {
}
@Override
public int compare(List> nodes1, List> nodes2) {
return sumNodes(nodes1).compareTo(sumNodes(nodes2));
}
/**
* Since given list of nodes represents a connected path, each subsequent nodes will exist in each previous node' toNodes collection.
*
* We need to calculate the distance this way, since Dijkstra's algorithm mutates the distance property for a single shortes path to a
* starting node.
*/
private Integer sumNodes(List> nodes) {
Node currentFromNode = null;
int nodesCost = 0;
for (Node nodeInPath : nodes) {
if (currentFromNode != null) {
nodesCost += currentFromNode.getToNodes().get(nodeInPath);
}
currentFromNode = nodeInPath;
}
return nodesCost;
}
}