java - 高效存储稀疏二维网格

标签 java c design-patterns

我有一张巨大的 map ,上面有瓷砖。 这是一个地牢,所以显然有很多空白空间,我可以在其中存储空值。

显然,拥有一个巨大的二维数组是一种选择,但我认为这不是最优雅的选择。此外,当我想将其保存到文件时,存储大量的空标记并不是很整洁。

类似这样,但要大得多:

+--------------+
|   X     X    |
| XXX    XX    |
|   XXXXXXX    |
|    X   XX    |
|   XXX   XXX  |
|     X   X    |
+--------------+ 

除了宽×高数组,我还有哪些其他选择?

只有像 Map<IntCoord, Tile> 这样的东西?或者是否有针对类似场景的一些广泛使用的解决方案?

最佳答案

您可以使用三样东西:

  1. 二维数组。
  2. 列表。
  3. map 。

二维数组是最好的,除非你的 map 很大,在这种情况下你可以使用列表。


二维数组:

优点:它具有最快的查找时间。

缺点:它(很可能)占用最多的内存。

查找时间可能大大超过内存成本。除非您的地牢有数十万格那么大,否则这可能是可行的方法。


列表(可能是 ArrayList):

优点:只存储您需要的元素。

缺点:查找时间非常糟糕。

虽然列表会使用较少的内存,但查找图 block 或项目会花费更长的时间,因为您必须遍历列表才能找到与位置匹配的内容。


Map(可能是 HashMap):

优点:每个位置都将链接到每个 map 的一个对象,因此查找时间还可以。

缺点:查找时间不会是最佳的,会使用适量的内存。

映射介于列表和数组之间。与数组相比,它们会占用更多内存,但查找时间比列表短。


由于查找时间短,二维数组是最好的。在大多数现代计算机上,内存不是问题。如果是,您始终可以缓存当前未用于文件的区域并根据需要动态加载它们。

关于java - 高效存储稀疏二维网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23162562/

相关文章:

android - 使用更困惑的代码设计应用程序?

design-patterns - 正确使用 IoC 容器如何帮助您避免使用工厂?

java - 从嵌套的json字符串中提取double并打印

java - 当复合键与实体一起使用时,分离的实体被传递以保留

c - C中的递归打印函数

将 char 转换为 unsigned int - C

oop - 开闭原则和依赖倒置原则有什么区别?

java - 来自 API 的 Android 搜索建议

java - 为什么 getResourceAsStream() 在 JAR 文件中不起作用?

C HelloWorld exec 格式错误