我为我的程序编写了这些方法,我觉得它很难读,因为有太多的循环,是否有其他替代方法可以让它看起来更干净,更容易阅读
public static void printRoutingTable(Map <Node, List<Edge>> adj, Node Root)
{
for (Node thisNode : adj.keySet())
{
Node currentNode = thisNode;
String nextHop;
if(currentNode.getParent() != null){
do{
if(currentNode.getParent() != Root){
currentNode = currentNode.getParent();
nextHop = currentNode.getAddr();
}
else{
nextHop = currentNode.getAddr() ;
}
}
while(currentNode.getParent() != Root);
}
else
{
nextHop = ""+currentNode.getAddr();
}
nextHop = nextHop.trim();
}
}
答案 0 :(得分:0)
我没试过,但这应该是您的代码的功能和递归版本。
String getNextAddr(Node node, StringBuilder sb, Node root) {
sb.add(node.getAddr());
if (node.getParent() != null && node.getParent() != root) {
return getNextAddr(node.getParent(), sb);
}
return sb.toString();
}
String nextHopList =
adj.keySet()
.stream()
.map(k -> getNextAddr(k, new StringBuilder(), Root))
.collect(Collectors.toList())
答案 1 :(得分:0)
很难说出你的代码想要实现的目标。目前它实际上并没有做任何事情,因为nextHop
变量是本地的,似乎没有任何东西在循环中积累。我假设你打算加入你正在产生的字符串。
Stream
)节点。Optional<Node>
而不是getParent
返回Node
。所以考虑这些建议,如下所示:
String getRoutingTable(Stream<Node> nodes) {
return nodes
.flatMap(this::getRoutingForNode)
.map(Node::getAddr)
.collect(joining(";"));
}
private Stream<Node> getRoutingForNode(Node node) {
Stream.Builder<Node> pathToRoot = Stream.builder();
for (Node c = node; c.getParent().isPresent(); c = node.getParent().get()) {
pathToRoot.accept(c);
}
return pathToRoot.build();
}
请注意,在Java 9中,getRoutingForNode
将变得更具可读性,因为您可以免除Builder
:
return Stream.iterate(node,
n -> node.getParent().isPresent(),
n -> n.getParent().get());