1

有没有办法以确定的顺序遍历 Guava Graph?

我试图通过这个测试来做到这一点:

import com.google.common.graph.ElementOrder;
import com.google.common.graph.Graph;
import com.google.common.graph.GraphBuilder;
import com.google.common.graph.Traverser;

import java.util.Random;

public class TestGraph {
    private static final Random random = new Random();

    static class Node { //Node class with volatile hashcode
        private final int hashcode = random.nextInt();
        private final String name;

        public Node(String name) {this.name = name; }

        @Override public String toString() {return name; }

        @Override public int hashCode() {return hashcode;}
    }

    public static void main(String argv[]) {
        Node root = new Node("root");
        Graph<Node> graph = GraphBuilder.directed()
                .nodeOrder(ElementOrder.insertion())
                .<Node>immutable()
                .putEdge(root, new Node("one"))
                .putEdge(root, new Node("two"))
                .putEdge(root, new Node("three"))
                .build();

        //Print the nodes in traversal order.
        Traverser.forGraph(graph).depthFirstPostOrder(root)
                .forEach(x->System.out.println(x));
    }
}

每次它以不同的顺序进行评估。我认为根本原因是图表后继者没有排序。

4

1 回答 1

3

您可以在此处查看有关此主题的一些讨论,以及获得所需内容的技巧:https ://github.com/google/guava/issues/2650

也就是说,我们最近一直在寻找一些替代方案来提供此功能,并且似乎很可能在即将发布的 Guava 版本中实现。不过,它可能会带来一些额外的内存开销(10-20%)。

如果我们确实提供了这种能力,它几乎肯定会通过GraphBuilder作为图的属性来指定。

于 2019-08-24T16:23:02.330 回答