用1行代码实例化和初始化对象数组

时间:2019-05-09 17:44:41

标签: java arrays

首先,如果标题有误导性,我深表歉意。我想用Java实现自己的Minesweeper版本。当我创建对象数组并测试我的一个功能时,我得到了NullPointerException。浏览堆栈溢出我设法解决了我的问题。但是事实证明,必须先实例化然后初始化数组。所以我要问的是:我可以实例化一个对象数组并同时对其进行初始化吗?

MineSweeperMain.java

public class MineSweeperMain {
    public static void main(String[] args) {
        MineSweeper ms = new MineSweeper(9,9);
        int test;
        for (int i=0;i<9;i++)
            for (int j=0;j<9;j++)
            {
                ms.tile[i][j]=new Tile(); // can I initialize the array in the same line that I am instantiating it using the default constructor? 
            }
        test = ms.tile[0][0].getNeighbours();
        System.out.println("Test: " + test);
    }
}

Tile.java

public class Tile {
    int numNeighbours;
    boolean hasBomb;

    Tile() {
        numNeighbours = 0;
        hasBomb = false;
    }


    int getNeighbours() {
        return numNeighbours;
    }

    boolean hasBomb() {
        return hasBomb;
    }
}

Minesweeper.java

public class MineSweeper {
    Tile tile[][];

    MineSweeper(int x,int y) {
        tile = new Tile[x][y];
    }
}

谢谢。

编辑:使用tile[9][9]();也不起作用。

3 个答案:

答案 0 :(得分:2)

也许这就是您想要做的...

window = tkinter.Tk()
window.title("Sample App")
window.geometry('640x480')

tkinter.Label(window, width="5", text="Title").grid(row="0", column="0")

答案 1 :(得分:1)

首先,使用2个嵌套的for循环填充二维数组的元素没什么问题。

但是,可以使用Java流在2D数组中生成新的Tiles。

Stream的代码开始,以生成Tile s的一维数组。

Tile[] oneDArray = Stream.generate(Tile::new).limit(9).toArray(Tile[]::new);

然后,您可以使用该表达式告诉外部Stream如何生成一维数组作为整个二维数组的一部分。

Tile[][] tile = Stream.<Tile[]>generate(
        () -> Stream.generate(Tile::new).limit(x).toArray(Tile[]::new)
    ).limit(y).toArray(Tile[][]::new);

出于类型推断的目的,我必须明确提供Tile[]类型参数。

我把它写成多行,但这全是一条语句。无论您选择哪种方式,嵌套的for循环或此流解决方案,都可以将代码移入Minesweeper构造函数中,以便将其隐藏在main代码中。

答案 2 :(得分:0)

使用ArrayList。 在您的minesweeper类中,应该包含一个tile数组列表。 让Minesweeper的构造函数调用一个用tile填充arraylist的方法。 给每个图块一个X和Y坐标。 然后为了获得邻居,只需遍历图块arraylist以及tyle.getX和tyle.getY来确定它是否是边界……,或者它是否是炸弹..或是否已被翻转。

ArrayList tile = new ArrayList();

.....

平铺图块=新图块(X,Y)

tiles.add(tile)