java - 为什么 Queue<Integer> 在这里返回 Iterable<Integer> ?

标签 java graph directed-acyclic-graphs topological-sort

上下文:

我正在阅读 Sedgewick 和 Wayne 的算法的第 4 章。 此代码示例是“有向图中的深度优先搜索顶点排序”的代码示例。

        public class DepthFirstOrder
        {
            private boolean[] marked;
            private Queue<Integer> pre; // vertices in preorder
            private Queue<Integer> post; // vertices in postorder
            private Stack<Integer> reversePost; // vertices in reverse postorder
            public DepthFirstOrder(Digraph G)
            {
                pre = new Queue<Integer>();
                post = new Queue<Integer>();
                reversePost = new Stack<Integer>();
                marked = new boolean[G.V()];
                for (int v = 0; v < G.V(); v++)
                    if (!marked[v]) dfs(G, v);
            }
            private void dfs(Digraph G, int v)
            {
                pre.enqueue(v);
                marked[v] = true;
                for (int w : G.adj(v))
                    if (!marked[w])
                        dfs(G, w);
                post.enqueue(v);
                reversePost.push(v);
            }
            public Iterable<Integer> pre()
            { return pre; }
            public Iterable<Integer> post()
            { return post; }
            public Iterable<Integer> reversePost()
            { return reversePost; }
        }

我的问题是为什么队列在各自的检索方法中作为 Iterables 返回。 我明白了代码的其他作用,但我不明白为什么 prepostreversePost 在这里返回一个 Iterable,而它们是队列吗?

我了解 Iterable 接口(interface)通常的作用,并且队列也是 Iterable,因为 Collection 实现了 Iterable。

但是我不明白为什么这个实现将队列作为 Iterables 返回。

最佳答案

这样外部接口(interface)只 promise 它们是Iterable,而不是明确它们是Queue。这意味着:

  1. 可以更改实现,而不会影响类提供的接口(interface)。
  2. 返回队列的用户只能依赖它们是Iterable,具体来说,他们不能假设它们是Queue。 (这意味着除了 Iterable 所提供的 [remove] 之外,Queue 无法使用 Queue 提供的状态突变功能 - 并非没有强制转换它们,这将是一件坏事™,因为该类保证它们是Iterable,而不是它们是Queue。)

更具防御性的类可能会在实际的 Queue 和返回的对象之间插入一个外观,以防止执行上述第 2 项操作的编写不当的代码,但当然,这是有代价的。

关于java - 为什么 Queue<Integer> 在这里返回 Iterable<Integer> ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59920398/

相关文章:

java - Eclipse 中代码清理的快捷键

c# - 图表的轴值格式

plot - 为什么 Maxima 在尝试绘制参数图时在 plot2d 上给我一个错误?

python - 如何通过单个脚本生成多个 Airflow dags?

algorithm - 简单依赖算法的问题

java - 如何在java中创建一个appium android设备 "back button"

Java:监听远程 Linux 服务器上的目录更改

java - 在每个 JTextArea 中显示迭代

c++ - 如何使用 Boost Graph Library 更改图中的边权重?

cycle - 如何使用拓扑排序在有向图中找到循环?