繁体   English   中英

从ArrayList获取坐标(x,y)的快速方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM