如何让一个存储在二维数组中的类“知道”它们在其中的位置?

时间:2015-06-11 09:08:09

标签: c# arrays vb.net matrix

我认为标题说明了一切......但为了完整起见,这是一个完整的问题。

问题

所以,我在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可能会改变位置或被覆盖,我希望其位置能够动态确定。

然而,如果没有更好的雷达,我肯定会使用这种方法,然后根据位置变化更新值,

补遗

有些信息可能 - 或者不是 - 有用:

  • Matrix尺寸小于或等于(512,512)
  • 这将成为一个等距的地形数据地图生成器(所以没有3D,但我已经在单元格中有一个高度变量)游戏中有相当小的地图,支持山,河等表面特征,

3 个答案:

答案 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}}映射到表示xy的一对整数。我们称之为智能阵列SmartArray。它需要移动单元格的方法,以原子方式更新地图和网格(这是正常的,因为所有更改都在SmartArray“范围内”)。那么您可以询问SmartArray实例“网格上的哪个位置是单元格c?”你会在O(1)得到答案。这是对速度超过内存占用的权衡。但是,每个Cell必须知道其中包含SmartArray,因此它知道要问谁。

您也可以省略地图并保留查询方法,但每次询问问题时都要遍历网格。答案是相同的,查找将采用O(n^2),但移动单元格将更容易,因为您只需要更新一个结构。这将转变为一个有利于内存占用超速的权衡,它本质上是你在q中提到的双循环。

答案 2 :(得分:0)

首先要初始化N个元素,你必须调用你的初始化器N次,没有效率问题。

回答你的问题:你的物品不应该关心它的位置。集合中项目的位置不是项目本身的问题,如果您移动项目或更改集合,可能会很快导致头痛。 如果您的收藏从2d矩阵变为3d矩阵怎么办?你必须重写代码并添加一个Z变量(这只是一个简单的例子)。

我试图以另一种方式完全构建我的代码/解决方案。

顺便说一下,项目可以通过查找对自身的引用来定位自己的集合。 (根据需要调整代码到您的矩阵)

stop

由于您循环收集但性能很差,但它可能符合您的需求