我如何使一个类存储在二维数组"意识"他们在其中的地位
本文关键字:quot 他们 意识 在其中 何使一 存储 二维数组 | 更新日期: 2023-09-27 17:55:05
我觉得标题已经说明了一切…但为了完整起见,这里是完整的问题。
<标题>所以,我有一个2列数组(矩阵,或"网格")在Visual Basic/c#/Anything.net由声明为Public Matrix(,) As Cell
的Cell
实例组成。
A 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
我现在坚持它。因此这里有一个
<标题>可能的解决方案这意味着我可以在初始化时将索引传递给Position字段-通过构造函数-像这样…
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
可以改变位置或被覆盖,我希望它的位置是动态确定的。
然而,如果没有更好的雷达,我肯定会使用这种方法,然后根据位置变化更新值,
件>一些可能有用,也可能没用的信息:
- 矩阵大小小于等于(512,512)
- 这将成为一个地形数据地图生成器的等长(所以没有3d,但我已经有一个高度变量的细胞)游戏相当小的地图,支持表面特征,如山,河(s),
为什么你不能只是削减你的随机选择器只是返回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)
首先要初始化N个元素,你必须调用初始化器N次,没有效率问题。
回答你的问题:你的物品不应该关心它的位置。项目在集合中的位置不是项目本身的问题,如果您移动项目或更改集合,可能会很快导致令人头疼的问题。如果您的集合从2d矩阵更改为3d矩阵怎么办?您必须重写代码并添加Z变量(这只是一个快速示例)。我会尝试以另一种方式完全构建我的代码/解决方案。
顺便说一下,item可以通过查找对自身的引用来在集合中定位自身。(根据需要调整代码以适应矩阵)GetPosition( Array source)
{
foreach(var element in source)
Object.ReferenceEquals(this,element)
}
性能很差,因为您循环了集合,但它可能符合您的需求
这真的是一个造型的问题。我个人更喜欢如果细胞知道他们的位置,因为它似乎对他们很重要,但是对于一个你似乎不喜欢这种方法,对于两个,当更新位置时,这必须在两个领域完成(通过一个助手方法)在受影响的细胞和网格中,这可能是有问题的。因此,其他内容:
如何从一个简单的2D数组转向构建你自己的类型,就像一个更智能的数组,它不仅保持单元格作为一个简单的2D数组,而且还记录每个Cell
的坐标——一个字典,它将每个包含Cell
映射到一对代表x
和y
的整数。我们把这个智能数组命名为SmartArray
。它将需要移动单元格的方法,这些方法可以自动更新地图和网格(这是可以的,因为所有更改都在SmartArray
"领域"内)。然后,您可以询问SmartArray
实例"Cell c
在网格上的位置?",您将在O(1)
中得到答案。这将是速度与内存占用之间的权衡。然而,每个Cell
必须知道它们所包含的SmartArray
,这样它就知道该问谁。
您还可以省略映射并保留查询方法,但使它们在每次提出问题时遍历网格。答案将是相同的,查找将采取O(n^2)
,但移动单元格将更容易,因为您只需要更新一个结构。这将把权衡转向一个更倾向于内存占用而不是速度的方面,它本质上就是您在q.