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 クラスでオブジェクトをインスタンス化する必要がありました。次に、返された RowCol 値を分離するように getLayout クラスを変更しました。これが更新されたクラスです。この時点での問題は、行と列を整数に変換できないため、そのまま使用できることです。

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;

インデックスでさらに使用できるプライベート配列 myLayouts を返すメソッドを Layouts クラスに作成することをお勧めします。

そして、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、 a が取得されます。NullPointerException

アップデート:

発生している問題parseIntは、配列で生の型付きジェネリックを使用しているという事実に起因しています。RowColクラスの宣言に型パラメーターがあります (class RowCol<R, C>型パラメーターRとがありCます) が、 のインスタンスを宣言するときに型を指定していない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注釈はそれを処理する必要があります。ArrayListArray の代わりに (完全な汎用サポートを持つ) を使用することで、この問題を完全に回避することもできます。

于 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 に答える