我正在制作一款游戏,该游戏使用多个HashMap<Point, Integer>
来存储分配给坐标的值。为了使其更简单并减少重复,我使用一个名为GamePoint的类扩展了Point类。它有一个equals()方法,只比较x和y,它也适用于Point。由于我不再需要HashMap的键值关系,我只需将其放入ArrayList即可。
使用HashMap我得到了:
HashMap<Point, Tile> tileMap; //already built at that stage
public static Tile getTile(int x, int y) {
Point p = new Point(x,y);
if(matrix.containsKey(p)){
return tileMap.get(p);
} else return Tile.BOUNDS;
}
从那个Tile(这是一个枚举)我会得到图像索引。 现在我这样做是为了从ArrayList中获取我的值:
ArrayList<GameTile> gameTiles; //already built at that stage
public static int getGameTileIndex(int x, int y) {
Point p = new Point(x,y); //only for finding the coordinates
for(GameTile gt : gameTiles){
if (p.equals(gt)){
return gt.getImageIndex();
}
}
return 0; //empty tile
}
不幸的是,没有可以返回GameTile的直接方法。迭代真的非常非常慢,因为我有1.000.000个条目,并且在最后的游戏中会有更多。
以下是我需要知道的事情:
是否正在迭代ArrayList以检索GameTile?我应该继续使用HashMap并使用类似HashMap<Point, GameTile>
的内容吗?
或者我可以以某种方式使用get(int index)方法,知道数组中填充了类似于此的嵌套循环:
List<Point> referencePoints;
for (int x; x<width; x++){
for (int y; y<height; y++){
Point p = new Point(x,y);
height = calculateHeight(x,y);
tileMap.put(p, height);
referencePoints.add(p);
}
}
for (Point p: referencePoints){
GameTile tile;
if (float height = getHeight(p) > THRESHOLD){
tile= new GameTile.GrassTile(p.x,p.y);
}
else {
tile= new GameTile.WaterTile(p.x,p.y);
}
gameTiles.add(tile);
}
注意:我真的觉得有一种非常合理的方法可以使用x,y变量进行索引检索,但我现在无法将我的想法放在一起。
编辑: 我选择了HashMap,它现在就像魅力一样。答案虽然给了我一个新的视角,但无法帮助我解决问题,它仍然保持原样。我发现了一个适用于我的案例的解决方法,现在将使用它。
答案 0 :(得分:2)
是否正确迭代ArrayList以检索GameTile?
没办法。您的HashMap
实施远远优于迭代。
我应该继续使用HashMap并使用类似HashMap的东西吗?
没有。索引到ArrayList
比使用HashMap
要快得多。
或者我可以以某种方式使用get(int index)方法吗?
是。老实说,如果使用二维数组x x,可能会更容易理解。但它会像你在那个伪代码中那样铺设它的方式。这将是您最有效的解决方案。
答案 1 :(得分:0)
如果你有一个固定数量的点并且你知道每个点都有一个瓦片,一个选项是制作二维数组并将你的瓦片存储在那里,如下所示:
GameTile tiles[][] = new GameTile[n][n];
通过这种方式,您可以通过
快速访问(i,j)处理的图块GameTile tile = tiles[i][j];
当然,内存复杂性为O(n 2 )。
如果你有少量的瓷砖与n 2 相比,那么我认为HashMap确实是你最好的选择。