3

正如您将看到的,我对面向对象编程相当陌生。我正在尝试自学,但被困在这一点上,无法弄清楚该怎么做。

我正在尝试编写一些代码来将矩形网格布局为行和列。想想“把小方块放在一个大矩形上”。用户将输入他们有多少个“小方块”。我的目标是将这个整数映射到行和列的最佳布局中。

用户可以输入从 20 到 100 的任何整数。对于 81 个不同的可能条目中的每一个,我已经确定了在行和列中布置这些小方块的最佳方式。我现在需要做的是将这 81 种不同的布局放入我的程序中,然后识别并返回适用于用户输入的布局。

由于只有 81 个值并且它们的范围是连续的整数,因此我认为数组是最好的主意(而不是映射、哈希映射、向量等)。这是我到目前为止所拥有的。这有点乱,但我想你会明白我在做什么。谁能帮我?我似乎无法返回我需要的行和列值。

谢谢!

public static void getLayout (int numSquares) {

    int rows;
    int columns;        

    Layouts myLayout = new Layouts();

    rows = myLayout[numSquares].r; //this is where it fails
    columns = myLayout[numSquares].c;
}

class RowCol<R, C> {

    /* Class Variables */
    public final R r;
    public final C c;

    public RowCol(R r, C c) {
        this.r = r;
        this.c = c;
    }

    public R getRow() {return r;}
    public C getCol() {return c;}
}

class Layouts {

    RowCol[] myLayouts;

    public Layouts() {

        /* Set the numbers of Rows and Columns for each possible
         * number of squares requested.
         */
            myLayouts[20] = new RowCol(5, 4);   // 20 Problems
            myLayouts[21] = new RowCol(7, 3);   // 21 Problems
            myLayouts[22] = new RowCol(5, 4);   // 22 Problems
            myLayouts[23] = new RowCol(5, 4);   // 23 Problems
            myLayouts[24] = new RowCol(6, 4);   // 24 Problems
            myLayouts[25] = new RowCol(5, 5);   // 25 Problems
            myLayouts[26] = new RowCol(6, 4);   // 26 Problems
            myLayouts[27] = new RowCol(6, 4);   // 27 Problems
            myLayouts[28] = new RowCol(7, 4);   // 28 Problems
            //etc...

编辑:应用下面的响应,我需要在 Layouts 类中实例化一个对象,我这样做了。然后,我修改了 getLayout 类以隔离返回的 RowCol 值。这是更新的课程。此时我的问题是我无法将行和列转换为整数,以便我可以这样使用它们。

public static void getLayout(int numSquares) {

    Layouts myLayout = new Layouts();
    RowCol myRC = myLayout.getLayout(numProbs);
    int rows = Integer.parseInt(myRC.getRow());
    int cols = Integer.parseInt(myRC.getCol());
}

错误是:

没有找到适合 parseInt(Object) 方法的 Integer.parseInt(String) 方法不适用(实际参数 Object 无法通过方法调用转换转换为 String)方法 Integer.parseInt(String,int) 方法不适用(实际和形式参数列表长度不同)

编辑:解决。谢谢大家!

4

4 回答 4

3

我可以在那里看到一个快速的问题。Layouts 类不以任何方式支持基于索引的访问。所以下面的代码会报错:

rows = myLayout[numSquares].r;

您可能希望在 Layouts 类中创建一个方法,该方法返回其私有数组 myLayouts,该数组可进一步与索引一起使用。

而且,正如 DaoWen 7 指出的那样,该数组需要在某个地方进行初始化。

我是用手机写的,所以不能输入太多:-P

于 2012-08-16T02:53:08.667 回答
2

当您混合使用数组和泛型时,由于类型擦除会发生奇怪的事情。

我可能不会创建RowCol一个泛型类,而只是int用于字段类型。

于 2012-08-16T02:46:02.510 回答
1

你初始化你的数组了吗?

RowCol[] myLayouts = new RowCol[81];

如果您不初始化数组,则myLayouts引用是,当您尝试分配或读取任何索引时null,您将得到一个。NullPointerException

更新:

您遇到的问题parseInt源于您在数组中使用原始类型的泛型这一事实。您在类的声明中具有类型参数RowColclass RowCol<R, C>具有类型参数RC),但是在声明 的实例时没有指定类型RowCol,因此它们只是默认为假定一切都是Object. 这应该解决它:

@SuppressWarnings("unchecked")
RowCol<Integer,Integer>[] myLayouts = new RowCol[81];
// . . .
myLayouts[20] = new RowCol<Integer,Integer>(5, 4);   // 20 Problems
myLayouts[21] = new RowCol<Integer,Integer>(7, 3);   // 21 Problems
// . . .

由于 Java 对泛型和数组的限制,上面会生成一个警告,但是@SuppressWarnings注释应该处理它。您还可以通过使用ArrayList(具有完整的通用支持)而不是数组来完全避免这个问题。

于 2012-08-16T03:35:48.317 回答
0

请在下面做

public static void getLayout (int numSquares) {

    int rows;
    int columns;        
    //Create object here currently if i create it then it will be my class specific
    Layouts myLayout = new Layouts();

    rows =myLayout.myLayouts[numSquares].r; //this is where it fails
    columns = myLayout.myLayouts[numSquares].c;
}

class RowCol<R, C> {

    /* Class Variables */
    public final R r;
    public final C c;

    public RowCol(R r, C c) {
        this.r = r;
        this.c = c;
    }

    public R getRow() {return r;}
    public C getCol() {return c;}
}

class Layouts {

    RowCol<Integer, Integer>[] myLayouts = new RowCol[81];

    public Layouts() {

        /* Set the numbers of Rows and Columns for each possible
         * number of squares requested.
         */
            myLayouts[20] = new RowCol<Integer, Integer>(5, 4);   // 20 Problems
            myLayouts[21] = new RowCol<Integer, Integer>(7, 3);   // 21 Problems
            myLayouts[22] = new RowCol<Integer, Integer>(5, 4);   // 22 Problems
            myLayouts[23] = new RowCol<Integer, Integer>(5, 4);   // 23 Problems
            myLayouts[24] = new RowCol<Integer, Integer>(6, 4);   // 24 Problems
            myLayouts[25] = new RowCol<Integer, Integer>(5, 5);   // 25 Problems
            myLayouts[26] = new RowCol<Integer, Integer>(6, 4);   // 26 Problems
            myLayouts[27] = new RowCol<Integer, Integer>(6, 4);   // 27 Problems
            myLayouts[28] = new RowCol<Integer, Integer>(7, 4);   // 28 Problems
            //etc...
    }
}
于 2012-08-16T03:48:21.360 回答