从不同实例添加集合

时间:2013-11-30 02:04:12

标签: collections smalltalk

我是Smalltalk的新手,我正在努力做一个非常简单的程序,以这种方式从多个集合中产生一个集合:

假设我有一套军械库,而且每个军械库都拥有自己的武器套装,我想要做的就是编写一个方法,返回一个集合,其中包含来自每个军械库的所有武器组合。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:7)

尝试这样的事情:

armories inject: OrderedCollection new into: [:collection :armory |
   collection addAll: armory weapons; yourself].

答案 1 :(得分:4)

我想通过提出这个解决方案来改善大卫的答案:

armories inject: OrderedCollection new into: [:allWeapons :armory |
  allWeapons, armory weapons]

由于,返回2个集合的连接。

现在还有一种更“流畅”的方式,而没有创建新的 OrderedCollection 。有一个名为fold:reduce:或'reduceLeft:`的方法,它是函数式编程的概念。所以你可以这样做:

(armories collect: #weapons) fold: [allWeapons :weapons |
  allWeapons, weapons]

所以armories collect: #weapons会给你一系列武器。 fold:获取第一个元素和第二个元素并对它们执行块。然后取一个结果和一个第三个元素,依此类推......

现在我知道的最佳解决方案是flatCollect:。我确信它出现在中,但可能会丢失其他基于smalltalk的语言。这与collect:相同,但将结果展平为一级。所以你要做的就是:

armories flatCollect: #weapons

享受

答案 2 :(得分:1)

大卫的答案是经典的小屁股成语。在进行更复杂的组合时,您可能更喜欢基于流的方法:

OrderedCollection fromStream: [:allWeapons |
    allWeapons nextPutAll: armories collect: [:armory | armory weapons]]