如何以确定性顺序遍历番石榴图



有没有办法以确定性顺序遍历guava图?

我试图通过此测试进行操作:

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

每次以不同的顺序评估。我认为根本原因是未订购图形后继。

您可以看到有关此主题的一些讨论,而黑客获得了您想要的东西,请在此处:https://github.com/google/guava/guava/sissues/issues/2650

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

如果我们确实提供了此功能,则几乎可以肯定会通过GraphBuilder指定该功能。

最新更新