0

我有一种方法可以从文本文件中加载图块。瓷砖在创建时放置在一个数组中,以便以后可以清除它们。这已经开始引起问题,我想知道是否有办法创建一个名称与加载的文本文件相对应的数组。例如,我打电话

loadMap("map1");

“map1”是存储地图的 txt 文件的名称。如果我要使用“map1”的参数调用 loadMap 方法,我如何创建一个名为“map1TileArray”的数组,或者如果参数是“finalMap” 我想要一个名为“finalMapTileArray”的数组。是否有可能做这样的事情,如果可以,怎么做?

编辑:

我得到一个NPE。

我这样声明我的地图:

Map<String, ArrayList<Tile>> tileMap = new HashMap<String, ArrayList<Tile>>();

然后,我将 ArrayList 与当前地图的字符串一起存储在 tileMap 中:

tileMap.put(map, tilearray);

但我在这一行得到一个错误:

if(tileMap.get(currentMap).size()>0) {

这是我的 unloadTiles 方法的开始。currentMap 只是程序所在地图的字符串。

4

4 回答 4

6

您将需要使用 Map,例如 HashMap,也许是Map<String, Integer[]>. 这将允许您创建一个整数(或其他)数组并将其与字符串相关联。

例如:

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class Foo {
   public static void main(String[] args) {
      Map<String, Integer[]> myMap = new HashMap<>();
      myMap.put("foo", new Integer[] { 1, 2, 3 });
      myMap.put("bar", new Integer[] { 3, 4, 5 });
      myMap.put("spam", new Integer[] { 100, 200, 300 });

      for (String key : myMap.keySet()) {
         System.out.printf("%8s: %s%n", key, Arrays.toString(myMap.get(key)));
      }
   }
}
于 2013-09-18T00:42:34.410 回答
1

使用java.util.Map并将值分配给变量。如果使用列表而不是数组,可能会更好

List<Integer> currentArray = loadMap("map1");

.... 
// inside
private List<Integer> loadMap( String fileName ) { 
    List<Integer> result = allTheMaps.get( fileName );
    if ( result == null ) { 
       // load it from file... 
       result = .... 
       allTheMaps.put( fileName, result ); 
    }
    return result;
}
于 2013-09-18T00:46:59.297 回答
1

正如其他人所说,地图将为此工作。

其他人没有说的是,您可能也会从使用类来表示您的图块中受益。

这样,您用于操作图块的任何数组逻辑都可以很好地封装在一个地方。我会想象这样的事情:

public class Tiles{
    private int[] tiles;
    private String name;
    private Tile(int[] tiles, String name){
        this.tiles = tiles;
    }

    public static Tiles getTiles(Map<String, Tiles> tilesCache, String tileName){
        if (tilesCache.containsKey(tileName)){
            return tilesCache.get(tileName);
        }
        // load from file
        return tile;
    }

    public void clear(Map<String, Tiles> tilesCache){
        tilesCache.remove(this.name);
        this.tiles = null;
    }

    //Other logic about tiles
}
于 2013-09-18T01:06:09.547 回答
0

您可能需要考虑使用一个HashMap,其中一个 String 作为键,一个 Integer[] 作为值。

    Map<String, Integer[]> maps = new HashMap<String, Integer[]>();

当你调用你的 loadMap 函数时,你可以做这样的事情。

    public Integer[] loadMap(String name) {
        if (maps.contains(name)) {
            return maps.get(name);
        }
        // Falls through if map is not loaded
        int[] mapData = new int[##];

        // load map

        maps.put(name, mapData);
        return mapData;
    }
于 2013-09-18T00:46:42.153 回答