[英]Fast way to get a coordinate(x,y) from an ArrayList?
我正在使用几个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现在作为魅力。 答案虽然给了我一个新的视角,但无助于我解决问题,它仍然保持原样。 我发现了一种适用于我的情况的解决方法,现在将使用它。
迭代ArrayList是否是检索GameTile的正确方法?
没门。 您的HashMap
实现远胜于迭代。
我应该呆在HashMap上并使用类似HashMap的东西吗?
不会。索引到ArrayList
会比使用HashMap
快得多。
还是可以以某种方式使用get(int index)方法?
是。 老实说,如果您使用x乘y的二维数组,可能会更容易理解。 但是它将按照您在伪代码中的布局方式进行工作。 这将是您最有效的解决方案。
如果您有固定数量的点,并且知道每个点都有一个图块,则一种选择是制作二维数组并将图块存储在其中,如下所示:
GameTile tiles[][] = new GameTile[n][n];
这样,您可以通过以下方式快速访问(i,j)处的图块
GameTile tile = tiles[i][j];
当然,为此的存储器复杂度为O(n 2 )。
如果与n 2相比,您的瓦片数量较少,那么我认为HashMap确实是您的最佳选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.