算法(4th ed)(118):基础——背包、队列和栈 5.1.3

阅读数:24 2019 年 11 月 2 日 12:27

算法(4th ed)(118):基础——背包、队列和栈 5.1.3

(API:可迭代的集合类型)

对于许多应用场景,用例的要求只是用某种方式处理集合中的每个元素,或者叫做迭代访问集合中的所有元素。这种模式非常重要,在 Java 和其他许多语言中它都是一级语言特性(不只是库,编程语言本身就含有特殊的机制来支持它)。有了它,我们能够写出清晰简洁的代码且不依赖于集合类型的具体实现。例如,假设用例在Queue 中维护一个交易集合,如下:

复制代码
Queue<Transaction> collection = new Queue<Transaction>();

如果集合是可迭代的,用例用一行语句即可打印出交易的列表:

复制代码
for (Transaction t : collection)
{ StdOut.println(t); }

这种语法叫做foreach 语句:可以将for 语句看做对于集合中的每个交易 t(foreach)执行以下代码段。这段用例代码不需要知道集合的表示或实现的任何细节,它只想逐个处理集合中的元素。相同的for 语句也可以处理交易的Bag 对象或是任何可迭代的集合。很难想象还有比这更加清晰和简洁的代码。你将会看到,支持这种迭代需要在实现中添加额外的代码,但这些工作是值得的。

有趣的是,StackQueue 的 API 的唯一不同之处只是它们的名称和方法名。这让我们认识到无法简单地通过一列方法的签名说明一个数据类型的所有特点。在这里,只有自然语言的描述才能说明选择被删除元素(或是在 foreach 语句中下一个被处理的元素)的规则。这些规则的差异是 API 的重要组成部分,而且显然对用例代码的开发十分重要。

评论

发布