Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA 2D数组阅读器使用扫描仪,如何将字符串转换为对象? 我正在为我的游戏创建一个地图阅读器。我将简要地解释一下我目前是如何使用它的,以及接下来我希望它如何使用_Java_Multidimensional Array - Fatal编程技术网

JAVA 2D数组阅读器使用扫描仪,如何将字符串转换为对象? 我正在为我的游戏创建一个地图阅读器。我将简要地解释一下我目前是如何使用它的,以及接下来我希望它如何使用

JAVA 2D数组阅读器使用扫描仪,如何将字符串转换为对象? 我正在为我的游戏创建一个地图阅读器。我将简要地解释一下我目前是如何使用它的,以及接下来我希望它如何使用,java,multidimensional-array,Java,Multidimensional Array,我有两个阵列。一个阵列用于瓷砖(可以移动的块)和一个阵列用于实体(战利品、敌人、玩家)。对于平铺,我使用2D int数组,但是对于实体,我使用接口2D数组(我已经创建)。实体中的所有对象都实现了接口(显然)。硬编码的Entitymap如下所示: entityArray = new EntityInterface[][]{ {null, null, null, null, null, null, null, new Chest(7, 0, Entity.GEM, 5), null,

我有两个阵列。一个阵列用于瓷砖(可以移动的块)和一个阵列用于实体(战利品、敌人、玩家)。对于平铺,我使用2D int数组,但是对于实体,我使用接口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;
}
公共类ReadMap
{
私有整数宽度;
公共读取映射(文件映射文件){
readEntity(映射文件);
}
公共EntityInterface[]readEntity(文件映射文件){
EntityInterface[][]entityArray=null;
试一试{
int y=0;
扫描仪=新扫描仪(映射文件);
while(scanner.hasNextLine()){
字符串行=scanner.nextLine();
if(!line.startsWith(“###”){
if(第行包含(“:”){
String[]split=line.split(“:”);
如果(拆分[0]。等于(“宽度”)){
宽度=整数.parseInt(拆分[1]);
entityArray=new EntityInterface[10][width];//仅为测试而将高度设置为10
}
}
String[]split=line.split(“,”);
如果(拆分长度>=宽度){
对于(int i=0;i
如您所见,我检查了数组的宽度,随后在该数组中循环,然后尝试通过将字符串转换为对象来添加它。当然,数组会抱怨,因为数组只接受“EntityInterface”类型的对象对象并不是这样。我还尝试将EntityInterface强制转换为对象,基本上是向编译器保证,是的,该项确实是EntityInterface对象,但它不喜欢这样

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

我刚才还尝试用Object替换EntityInterface,然后将EntityInterface向下转换,这适用于硬编码映射(现在是2D对象数组),但不适用于读取映射

这就是ReadMap类中的for循环现在的情况(为了适应我现在使用2D对象数组而不是2D Entityinterface数组这一事实,进行了一些小的更改)

        for (int i = 0; i < width; i++) {
            Object object = split[i];
            entityArray[y][i] = object;
        }
for(int i=0;i
然而,虽然转换为对象的字符串是纸面上的对象,但不幸的是,它与我在硬编码映射中的对象不同。它仍然抛出CastClassException,无法将字符串转换为entityinterface。注意:硬编码的对象2D数组可以工作,而我将entityinterface转换为该列表,它可以完美地工作,只是w在文本文件中出现问题

这是编译器向我抛出的错误
[错误]java.lang.ClassCastException:无法将java.lang.String转换为XXX.EntityInterface[/ERROR]


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

您试图将
字符串
强制转换为
EntityInterface
,而这两个实体彼此之间没有关系。您必须构造一个实现
EntityInterface
的对象(如果名称所示为接口)通过使用构造函数。创建一个工厂,当作为参数传递字符串时(例如,当param=“Door”返回新门(…)将创建正确的EntityInterface对象。所有对象都实现EntityInterface。当我尝试从文本文件(以字符串形式返回所有数据)获取数据时,会出现此问题我想转换这个字符串,我试着将它转换成一个有效的对象,但在该对象上强制转换EntityInterface不起作用,因为它仍然将它视为一个stringI我明白你的意思@StephaneM,但这会导致Door包含的特定参数出现问题,我相当愚蠢地在te中忽略了Door对象的参数xt文件,对此我深表歉意。因此,实际上,门的属性类似于new door(x,y,LinkedMapFile)每个门都有特定的属性,战利品和其他物品也是如此。@Hoaz…你读过我说的吗。你从文本文件中检索到的
字符串
对象没有实现
实体界面
。你可以将
字符串
向上投射到
对象
并将其视为
对象,但它是作为
字符串
,您不能期望程序将其神奇地转换为
EntityInterface
。您必须提供一个工具,将
字符串
转换为
EntityInterface
,这是通过自己构造来实现的。