我如何使一个类存储在二维数组"意识"他们在其中的地位

本文关键字:quot 他们 意识 在其中 何使一 存储 二维数组 | 更新日期: 2023-09-27 17:55:05

我觉得标题已经说明了一切…但为了完整起见,这里是完整的问题。

<标题>

所以,我有一个2列数组(矩阵,或"网格")在Visual Basic/c#/Anything.net由声明为Public Matrix(,) As CellCell实例组成。

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映射到一对代表xy的整数。我们把这个智能数组命名为SmartArray。它将需要移动单元格的方法,这些方法可以自动更新地图和网格(这是可以的,因为所有更改都在SmartArray"领域"内)。然后,您可以询问SmartArray实例"Cell c在网格上的位置?",您将在O(1)中得到答案。这将是速度与内存占用之间的权衡。然而,每个Cell必须知道它们所包含的SmartArray,这样它就知道该问谁。

您还可以省略映射并保留查询方法,但使它们在每次提出问题时遍历网格。答案将是相同的,查找将采取O(n^2),但移动单元格将更容易,因为您只需要更新一个结构。这将把权衡转向一个更倾向于内存占用而不是速度的方面,它本质上就是您在q.

中提到的双循环。