0

はしごのような言葉遊びのデザイン手法の選択という質問を見つけました。私もこの種のプログラムをやりたいと思っています。私はいくつかのコードを書きましたが、すでに 2 つの問題があります。これが私がすでに持っているものです:

グリッド :

public class Grid {    
    public Grid(){}
    public Grid( Element e ){}
}

エレメント :

public class Element {  
    final int INVISIBLE = 0;
    final int EMPTY = 1;
    final int FIRST_LETTER = 2;
    final int OTHER_LETTER = 3;   
    private int state;
    private String letter;

    public Element(){}  
//empty block    
    public Element(int state){
        this("", 0);
    }  
//filled block
    public Element(String s, int state){
        this.state = state;
        this.letter = s;
    }

    public static void changeState(int s){
    }

    public int getState(){
        return state;
    }

    public boolean equalLength(){
        return true;
    }

    public boolean equalValue(){
        return true;
    }

    @Override
    public String toString(){
        return "["+letter+"]";
    }
}

主要:

import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        System.out.println("Height: ");
        while (!sc.hasNextInt()) {
            System.out.println("int, please!");
            sc.next();
        }
        final int height = sc.nextInt();
        Grid[] game = new Grid[height];

        for(int i = 1; i <= height; i++) {
            String s;
            do {
                System.out.println("Length " + i + ", please!");
                s = sc.next();
            } while (s.length() != i);

            Element[] line = new Element[s.length()+1];
            Element single = null;
            String[] temp = null;

//ここで発行

            temp = s.split("");
            System.out.println("s.length: "+s.length());
            System.out.println("temp.length: "+temp.length);

///

            for(String str : temp){
                System.out.println("str:"+str);
            }

            for (int k = 0 ; k < temp.length ; k++) {
                if( k == 0 ){
                    single = new Element(temp[k], 2);
                    System.out.println("single1: "+single);
                }
                else{
                    single = new Element(temp[k], 3);
                    System.out.println("single2: "+single);
                }
                line[k] = single;
            }

            for (Element l : line) {
                System.out.println("line:"+l);
            }

//ここで発行

            game[i] = line;
        }

///

        for (Grid g : game) {
            System.out.println(g);
        }
    }
}

debug の出力例:

Height: 
3
Length 1, please!
A
s.length: 1
temp.length: 2
str:
str:A
single1: []
single2: [A]
line:[]
line:[A]

これが私がそれがどのように機能するべきだと思うかです。ユーザーの言葉をつかみます。次に、ゲーム全体の Grid 要素を作成します。次に、行ごとに行という Element[] 配列を作成します。与えられたテキストを分割すると、ここに最初の問題があります。string.split() が空白を追加するのはなぜですか? 理由もなく追加されていることが出力ではっきりとわかります。どうすればそれを取り除くことができますか (コードを実行するためだけに行の長さに +1 を追加する必要がありました)。続けて、分割されたテキストを一時的な String 配列にスローし、次に各文字から Element オブジェクトを作成して行配列にスローします。この空きスペース以外の出力は正常に見えます。しかし、次の問題はグリッドにあります。Element を引数として取るコンストラクターを作成しましたが、「互換性のない型」のために Grid[] 要素として行をスローすることはできません。どうすれば修正できますか?私はそれを正しくやっていますか?多分私は Element[] として行を取り除き、 Grid[][] を作成する必要がありますか?

4

2 に答える 2

1

1 - おそらく、split() ではなく String.charAt() を使用する必要があります。

2 - 「ゲーム」を「グリッド」オブジェクトの配列として宣言したため、「互換性のない型」を取得していますが、それに割り当てようとしている「線」オブジェクトは「要素の配列」型ではありません"。要素を格納するために 2 次元配列を使用した方がよい場合があります。

于 2010-05-16T22:22:52.317 に答える
1

なぜstring.split()空白を追加するのですか?

に空でない正規表現を指定する必要がありますstring.split():

for (String t : s.split(" ")) {
    System.out.println(t);
}
于 2010-05-16T19:24:17.633 に答える