[英]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.