使用Scanner的JAVA 2D阵列阅读器,如何将字符串转换为对象?

时间:2017-07-11 13:14:28

标签: java multidimensional-array

我正在为我的游戏创建地图阅读器。我将简要解释一下我目前是如何工作的,以及我希望它如何工作。

Atm我有两个阵列。一个用于Tiles的数组(一个可以移动的块)和一个用于实体的数组(Loot,敌人,玩家)。对于Tiles,我使用2D int数组,但对于Entities,我使用了一个接口2D数组(我已创建)。实体中的所有对象都实现了接口(显然)。硬编码的Entitymap如下所示:

    entityArray = new EntityInterface[][]{
    {null, null, null, null, null, null, null, new Chest(7, 0, Entity.GEM, 5), null, null, null, null, null, null, null, null, null},
    {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, new Door(1, 16, 1)},
    {player, null, null, null, null, null, null, null, null, null, null, null, null, null, null, new Loot(7, 2, Entity.GEM), null}
    };

逻辑已经被弄清楚,经过测试并且工作得很好,当我想从文本文件中读取这些实体数组时会出现问题。 在文本文件中,我写了以下内容:

WIDTH:7
null,null,null,null,new Door(),null,null

在我的mapReader类中,我有以下代码:

public class ReadMap
{
private int width;

public ReadMap(File mapFile) {
    readEntity(mapFile);
}

public EntityInterface[][] readEntity(File mapFile){
    EntityInterface[][] entityArray = null;
try {
    int y = 0;
    Scanner scanner = new Scanner(mapFile);
    while (scanner.hasNextLine()) {

    String line = scanner.nextLine();
    if (!line.startsWith("##")) {

        if (line.contains(":")) {
        String[] split = line.split(":");
        if (split[0].equals("WIDTH")) {
            width = Integer.parseInt(split[1]);
            entityArray = new EntityInterface[10][width]; //height set to 10 just for testing
        }
        }

        String[] split = line.split(",");
        if (split.length >= width) {
        for (int i = 0; i < width; i++) {
            Object object = split[i];
            System.out.println(object);
            entityArray[y][i] = object; //trying to add object to array

        }
        y++;
        }
    }

    }

} catch (FileNotFoundException e) {
    e.printStackTrace();
}
return entityArray;
}

正如您所看到的,我检查数组的宽度,然后循环遍历该数组,然后尝试通过将字符串转换为对象来添加它。当然数组会抱怨因为数组只接受“EntityInterface”类型的对象,而对象不是这样。我也尝试将EntityInterface转换为该对象,基本上承诺编译器是的,该项确实是一个Entityinterface对象,但它不喜欢它。

简而言之,我希望将文本文件中的项目转换为object / EntityInterface对象。

我刚刚尝试用Object替换EntityInterface,然后在链中进一步向下转换实体接口,这适用于硬编码地图(现在是2D对象数组),但不适用于读取地图。

这就是现在ReadMap类中for循环的方法(为了适应我现在使用2D对象数组而不是2D-Entity接口数组的事实的小改动

        for (int i = 0; i < width; i++) {
            Object object = split[i];
            entityArray[y][i] = object;
        }

然而,当转换成对象的字符串是纸上的对象时,遗憾的是它不像我硬编码地图中的对象。它仍然抛出CastClassException,无法将字符串转换为entityinterface。注意:硬编码的对象2D数组可以工作,我会将实体接口转换为该列表,它可以完美地工作,只是文本文件出现问题。

这是编译引发的错误 [ERROR] java.lang.ClassCastException:java.lang.String无法强制转换为XXX.EntityInterface [/ ERROR]

编辑:我通过将字符串转换为带有开关盒的代码来解决这个问题,即如果它看到(“DOOR”)它将获取该门的args,然后创建一个带有args的新门

0 个答案:

没有答案