存储静态对象列表的最有效方法是什么?

时间:2017-02-28 15:48:36

标签: java arrays performance arraylist hashmap

我正在尝试存储不同敌人的列表。每个敌人都有一个起源,只能在其原籍地产卵。每个敌人也有困难,应该与同样难度的敌人一起存放。

我把它想象成像这样的敌人的静态3D阵列:

Enemy[mountain][2][5] = new Enemy("troll")

字段是(从左到右)位置,难度,索引。

玩家输入的每个位置都会从此静态数组中填充一个敌人的ArrayList。

在这种情况下是否有更高效的数据结构?

(此列表将是硬编码的,在程序过程中不应更改)

编辑 -

我希望优化访问时间。这个游戏将生成许多位置,每个位置都需要根据其来源和难度从列表中随机抽取敌人。

根据要求,我会更多地考虑这个程序的用例。一旦我有一个适当的解决方案,我会更新。 (感谢)

2 个答案:

答案 0 :(得分:4)

概念上明智不是一个好主意。

此时你真的不担心性能。您担心创建一个有用的,有用的对象模型,它允许您编写优雅,易于阅读和易于增强的代码。

使用3D阵列实现了这些目标的 none

换句话说:你退后一步;并仔细思考需要访问你的敌人对象的“用例”。从那里来,你决定是否应该使用不同的地图;或不同的集合,...而不是使用3D作为中央“存储点”。

编辑,鉴于您的评论:这里有两个方面:

  1. 数组在Java中非常不灵活。您无法动态更改其大小。除此之外,它们使用起来真的很“丑陋”:这通过“三维”可能对某条“过路”很方便;但它可以使其他事情变得非常困难(比如搜索某个敌人时,那么你必须做这个3-dim迭代的东西......如上所述:丑陋)
  2. 应该尝试对具有高“发生率”的变化进行“开放”的设计。例如:你今天有一定数量的敌人;但假设你的“游戏”为你效力;你迟早会(更早)想要加强它;例如,允许动态添加/删除敌人。然后你使用三维数组编写的很多代码......将成为一个真正的障碍。
  3. 除此之外:是的,在“游戏世界”中,应该有一个组件,负责跟踪游戏中的所有元素。但是:这个组件内部组织的东西更像是一个实现细节。你应该专注于首先在GameWorld上放置“有用”的方法;或者像我之前说的那样:了解你的代码访问/迭代/搜索敌人以执行游戏本身的方式。然后,您将研究支持这些“用例”的数据结构。

    最后:假设这是一个学习练习 - 你仍然可以从一个3d数组开始。它会教你很多;我只是指出:你不会在更“真实世界”的应用程序中这样做;如果你选择这个选项,你很快就会遇到某些限制/障碍;只是根据你的解决方案的性质。

答案 1 :(得分:0)

我想到的是地图。位置是关键,值将是表示敌人及其位置的对象列表 - 让我们将其称为包含敌人及其位置的EnemyLocation对象(或者您可以更改Enemy以包含其位置,似乎是一个好主意,但我不知道你的代码)。所以,当玩家进入"山"你可以做一些像enemies.get(" mountain")这样的东西,然后你会找回一个敌人对象列表(或者EnemyLocation对象)