替代嵌套循环

时间:2017-04-27 22:59:50

标签: java

我为我的程序编写了这些方法,我觉得它很难读,因为有太多的循环,是否有其他替代方法可以让它看起来更干净,更容易阅读

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();
    }
}

2 个答案:

答案 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());