我认为标题说明了一切......但为了完整起见,这是一个完整的问题。
所以,我在Visual Basic / C#/ Anything.net中有一个2列数组(矩阵或“网格”),由Cell
个实例组成,声明为Public Matrix(,) As Cell
。
Cell
大概是这样的:
Class Cell
Public Value as integer
Public Height as integer
Public Tags as Dictionary
Sub New(Optional v As CellType = CellType.Void)
value = v
type = v
End Sub
Function GetPos() as Point
*need arcane necromancy here*
End Sub
End Class
问题很简单,但我知道答案可能不是:我可以获得Cell
的位置而不在构造函数中传递它吗?
这是我想要实现的一个例子(总是给出Public Matrix(,) As Cell
):
Dim x,y as integer
Dim apple as Cell = GetARandomAppleFrom(Matrix)
x=apple.GetArrayPos.x
y=apple.GetArrayPos.y
Console.WriteLine(String.Format("An Apple is in {0}, {1}",x,y)
目前,我正在使用以下代码片段将所有单元格初始化为零值,因为使用Matrix.Initialize()
失败,将每个元素设置为空。
如果方法描述说它调用默认构造函数,那么为什么会失败?
虽然我怀疑从编码/效率的角度来看我的初始化是正确的,因为我认为双循环并不是那么好......
For x = 0 To Me.zWidth
For y = 0 To Me.zHeight
Matrix.SetValue(New Cell(CellTypes.Void), x, y)
Next
Next
我现在坚持。因此这是一个
这意味着我可以在初始化时将索引传递给位置字段 - 通过构造函数 - 就像这样......
For x = 0 To Me.zWidth
For y = 0 To Me.zHeight
Matrix.SetValue(New Cell(CellTypes.Void,x,y), x, y)
Next
Next
但是,由于Cell
可能会改变位置或被覆盖,我希望其位置能够动态确定。
然而,如果没有更好的雷达,我肯定会使用这种方法,然后根据位置变化更新值,
有些信息可能 - 或者不是 - 有用:
答案 0 :(得分:0)
为什么你不能减少你的随机选择器只返回找到的x,y值并使用它来检索你的细胞?像这样:
Dim pt as Point
pt = GetRandomPosition()
Dim apple as Cell = Matrix(pt.X,pt.Y)
Console.WriteLine(String.Format("An Apple is in {0}, {1}",pt.X,pt.Y)
答案 1 :(得分:0)
这确实是一个建模问题。我个人更喜欢细胞知道它们的位置,因为它似乎对它们很重要,但对于一个你似乎不喜欢这种方法,而对于两个,当更新位置时,这必须在两个领域完成(通过辅助方法)立刻 - 在受影响的细胞和网格中,这可能是有问题的。因此,别的东西:
如何从简单的2D阵列走向构建自己的类型,如同一个更智能的阵列,不仅将单元格网格保持为简单的2D数组,而且还记录每个Cell
及其坐标 - 一个字典,将每个包含Cell
的{{1}}映射到表示x
和y
的一对整数。我们称之为智能阵列SmartArray
。它需要移动单元格的方法,以原子方式更新地图和网格(这是正常的,因为所有更改都在SmartArray
“范围内”)。那么您可以询问SmartArray
实例“网格上的哪个位置是单元格c
?”你会在O(1)
得到答案。这是对速度超过内存占用的权衡。但是,每个Cell
必须知道其中包含SmartArray
,因此它知道要问谁。
您也可以省略地图并保留查询方法,但每次询问问题时都要遍历网格。答案是相同的,查找将采用O(n^2)
,但移动单元格将更容易,因为您只需要更新一个结构。这将转变为一个有利于内存占用超速的权衡,它本质上是你在q中提到的双循环。
答案 2 :(得分:0)
首先要初始化N个元素,你必须调用你的初始化器N次,没有效率问题。
回答你的问题:你的物品不应该关心它的位置。集合中项目的位置不是项目本身的问题,如果您移动项目或更改集合,可能会很快导致头痛。 如果您的收藏从2d矩阵变为3d矩阵怎么办?你必须重写代码并添加一个Z变量(这只是一个简单的例子)。
我试图以另一种方式完全构建我的代码/解决方案。
顺便说一下,项目可以通过查找对自身的引用来定位自己的集合。 (根据需要调整代码到您的矩阵)
stop
由于您循环收集但性能很差,但它可能符合您的需求