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

时间:2015-02-04 23:53:17

标签: java arraylist iteration point

我正在制作一款游戏,该游戏使用多个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,它现在就像魅力一样。答案虽然给了我一个新的视角,但无法帮助我解决问题,它仍然保持原样。我发现了一个适用于我的案例的解决方法,现在将使用它。

2 个答案:

答案 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确实是你最好的选择。