Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.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 ArrayList以某种方式清除,而我不';我不知道为什么_Java_Arraylist_Hashmap - Fatal编程技术网

Java ArrayList以某种方式清除,而我不';我不知道为什么

Java ArrayList以某种方式清除,而我不';我不知道为什么,java,arraylist,hashmap,Java,Arraylist,Hashmap,我正在为我的游戏进行世界生成,有多个世界,我用一个hashmap和一个arraylist存储,其中的键是行星&一个arraylist存储每个行星的瓷砖。它似乎正在清除或未在hashmap中设置arraylist。我决定把这个贴在这里,因为更多的眼睛肯定会有帮助。我使用的是slick2d,下面是处理进入和离开地球的代码 WorldGenerator world = new WorldGenerator(25, p); public static int worldType = 0; public

我正在为我的游戏进行世界生成,有多个世界,我用一个hashmap和一个arraylist存储,其中的键是行星&一个arraylist存储每个行星的瓷砖。它似乎正在清除或未在hashmap中设置arraylist。我决定把这个贴在这里,因为更多的眼睛肯定会有帮助。我使用的是slick2d,下面是处理进入和离开地球的代码

WorldGenerator world = new WorldGenerator(25, p);
public static int worldType = 0;
public Planet planet;

HashMap<Planet, ArrayList<Tile>> worlds = new HashMap<>();

@Override
    public void enter(GameContainer container, StateBasedGame game) {

        System.out.println("Worlds: " + worlds.size());
        if (worlds.containsKey(planet)) {
            System.out.println("Contains key");
            worlds.get(planet).size();
            if (worlds.get(planet).isEmpty()) {

                System.out.println("ArrayList Empty");
                world.generate(worldType);
                worlds.put(planet, world.tiles);

            } else {
                System.out.println("ArrayList has tiles");
                world.tiles = worlds.get(planet);
            }

        } else {
            System.out.println("No key found");
            world.generate(worldType);
            worlds.put(planet, world.tiles);

        }

    }

    @Override
    public void leave(GameContainer container, StateBasedGame game) {
        worlds.replace(planet, world.tiles); // adds changes the player makes ( block breaks, etc )
        world.clear();

    }
WorldGenerator世界=新的WorldGenerator(25,p);
公共静态int worldType=0;
公共行星;
HashMap worlds=新的HashMap();
@凌驾
公共无效输入(GameContainer容器,StateBasedGame游戏){
System.out.println(“Worlds:+Worlds.size());
if(世界集装箱(行星)){
System.out.println(“包含键”);
worlds.get(planet.size();
if(worlds.get(planet.isEmpty()){
System.out.println(“ArrayList为空”);
生成(worldType);
世界.put(行星,世界.tiles);
}否则{
System.out.println(“ArrayList有分幅”);
world.tiles=worlds.get(行星);
}
}否则{
System.out.println(“未找到密钥”);
生成(worldType);
世界.put(行星,世界.tiles);
}
}
@凌驾
公共无效休假(GameContainer、StateBasedGame游戏){
worlds.replace(planet,world.tiles);//添加玩家所做的更改(断块等)
世界;
}
编辑:

公共类WorldGenerator{
浮子尺寸,高度=40;
玩家;
公共电话;
ArrayList tiles=新的ArrayList();
公共void生成(int类型){
isDone=false;
对于(int i=0;i15){
随机r=新随机();
int rnd=1+r.nextInt((10-1)+1);
如果(rnd>=8&&r.nextBoolean()){
添加(新的TileIronOre(j*32,i*32));
}否则{
添加(新瓷砖石(j*32,i*32));
}
}否则,如果(i>11){
添加(新的TileDirt(j*32,i*32));
}else如果(i==11){
添加(新瓷砖层(j*32,i*32));
}否则{
}
}
}
System.out.println(tiles.size()+“tiles”);
isDone=true;
}
公共空间清除(){
tiles.clear();
}

我认为问题可能是您的行星对象没有实现hashCode和equals方法。 这些对于HashMap能够识别您通过的行星和使用的键是相同的非常重要


希望有帮助。

我认为问题可能是您的行星对象没有实现hashCode和equals方法。 这些对于HashMap能够识别您通过的行星和使用的键是相同的非常重要



希望能有所帮助。

你能给出你尝试过的输入/输出示例吗?当然,它不会设置,因为你没有正确设置。@DeendayalGarg你能解释一下如何正确设置它吗?@GautamSavaliya它在第一次进入行星时添加了密钥,在它第一次看到密钥后,但数组列表是空的,这是我从调试中得到的did@cricket_007上面编辑的你能给出你尝试过的输入/输出示例吗?当然不会设置,因为你没有正确设置。@DeendayalGarg你能解释一下如何正确设置吗?@GautamSavaliya它在第一次进入行星时添加了密钥,在第一次看到密钥后,但是数组列表是空的,这是我从调试idid@cricket_007在上面编辑过的另一件事情是,在包含(worlds.get(planet.isEmpty())的if中,您也没有检查可能的null。例如:worlds.get(planet.isEmpty()| worlds.get(planet)==null。但是您的planet正在实现这些方法(hashcode和equals)?如果您使用的是Eclipse,则可以生成这些属性,您只需定义其中包含的属性。在您的类中,右键单击“源代码”->“生成哈希代码”和“等式”,确保在将这些方法中使用的所有属性填充到您的星球上,然后再将其传递到哈希映射。Oscar帮助我解决了这个问题,而不是一个蠢货,是他的道具。+1另一件事情可能是,在包含(worlds.get(planet.isEmpty())的if中,您也没有检查可能的null。例如:worlds.get(planet.isEmpty()| | worlds.get(planet)==null。但是您的星球正在实现这些方法(hashcode和equals)?如果您使用的是Eclipse,则可以生成这些属性,您只需定义其中包含的属性。在您的类中,右键单击“源代码”->“生成哈希代码”和“等式”,确保在将这些方法中使用的所有属性填充到您的星球上,然后再将其传递到哈希映射。Oscar帮助我解决了这个问题,而不是一个蠢货,是他的道具。+1
public class WorldGenerator {

    float size, height = 40;
    Player player;
    public boolean isDone;

    ArrayList<Tile> tiles = new ArrayList<>();



    public void generate(int type) {
        isDone = false;
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < size; j++) {
                if (i > 15) {

                    Random r = new Random();
                    int rnd = 1 + r.nextInt((10 - 1) + 1);

                    if (rnd >= 8 && r.nextBoolean()) {
                        tiles.add(new TileIronOre(j * 32, i * 32));
                    } else {
                        tiles.add(new TileStone(j * 32, i * 32));
                    }

                } else if (i > 11) {
                    tiles.add(new TileDirt(j * 32, i * 32));

                } else if (i == 11) {
                    tiles.add(new TileGrass(j * 32, i * 32));
                } else {

                }
            }
        }

        System.out.println(tiles.size() + " tiles");
        isDone = true;
    }

    public void clear() {
        tiles.clear();
    }