[英]Is there really no predefined dynamic 2d container in Smalltalk? Do I have to make my own?
我需要一个动态的2D容器,但令我感到惊讶的是,我在Collections中找不到任何有用的东西。 因此,我以过时的方式制作了自己的作品,但以某种方式,我觉得一定缺少某种东西。 smalltalk pharo中的整个概念基于使用他们的东西,而不必自己构建。
好的,因此您希望有按行和列排列的对象集合(在您的情况下为变形)。 这是一种方法
初始化:在类中创建一个实例变量来保存对象,并将其初始化为:
morphs := OrderedCollection new
加法:通过这种方法将新对象放入您的集合中
placeMorph: morph atRow: i column: j | row | row := morphs at: i ifAbsentPut: [OrderedCollection new]. j - row size timesRepeat: [row add: nil]. row at: j put: morph
需要注意的是通过添加nil
准确j - row size
倍(其可以是<= 0
)可确保在排狭槽的存在i
柱j
。
检索 :在网格或nil
的给定位置获取对象
morphAtRow: i column: j | row | row := morphs at: i ifAbsent: [^nil]. ^row at: j ifAbsent: [nil]
另一种可能性是使用Dictionary
,如果网格很大且稀疏,这可能很有意义。 在这种情况下,您可以执行以下操作
初始化
morphs := Dictionary new
加成
placeMorph: morph atRow: i column: j morphs at: i -> j put: morph
恢复
morphAtRow: i column: j ^morphs at: i -> j ifAbsent: [nil]
请注意,我已经使用关联i -> j
作为键。 另一种可能是使用对{ij}
。
Pharo具有Matrix
类。 那几乎是一个2D容器,除非您正在谈论我不明白的其他事情:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.