0

形を描いて動かすプロジェクトが予定されています。プログラム (私が難しいと思った部分) は問題なく動作しますが、教師はテキスト ファイルを使用してテストしようとしています。彼女が使用するコマンドを分解するのに苦労しています。私は bufferreader を使用してファイルを読み取ってから、トークンをループしますが、それが混乱するところです。トークンを文字列と整数に分割し、適切なメソッドをトリガーするにはどうすればよいですか? 建設的なガイダンスをいただければ幸いです。

ファイルを読み取るための私のコードは次のとおりです

   static void getTokens() throws Exception {

        Scanner input = new Scanner(System.in);

        System.out.print("Please enter the file name ---> ");
        fileName = input.next();

        FileReader fr = new FileReader(fileName);
        BufferedReader inFile = new BufferedReader(fr);
        String element = inFile.readLine();

       // tokenize string with " " as the delimiter
       StringTokenizer tokenizer = new StringTokenizer(element, " ");

       // loop through tokens
       while (tokenizer.hasMoreTokens()) {
           txtAnalysis(tokenizer.nextToken());

        }
       //close file
       inFile.close();
}

講師が使用するテキストの例を次に示します。

    start picture A
    circle 50 100 20
    coloredcircle 0 100 20 green
    end picture
    draw picture A blue 10 10
    dance picture A 30 30 
    erase
    start picture B
    rectangle 0 100 20 40
    rectangle 100 100 40 20
    rectangle 200 100 40 20
    Sshape 55 55 55 55 55 yellow Elf
    Sshape 55 25 35 45 65 red Ogre
    end picture
    draw picture B yellow 10 10
    erase
    draw picture A blue 10 10
4

2 に答える 2

2

このようなもの?

public void txtAnalysis(String line){
    if(line.startsWith("start picture")){
       String label = line.split(" ")[2];
       currentPicture = new Picture(label);
    }
    if(line.startsWith("end picture")){
       save(currentPicture);//or pictures.put(currentPicture.getLabel(), currentPicture);
       currentPicture = null;
    }
    if(line.startsWith("circle")){
       String[] parts = line.split(" ");
       currentPicture.addShape(new Cirlce(Integer.parseInt(parts[1]), Integer.parseInt(parts[2]), Integer.parseInt(parts[3])));
    }
    if(line.startsWith("draw picture")){
       String[] parts = line.split(" ");
       Picture pic = pictures.get(parts[2]);
       pic.draw(parts[3], Integer.parseInt(parts[4]), Integer.parseInt(parts[5]));
    }
    ...
}

このようなものを探していますか?

于 2013-10-10T14:47:27.130 に答える
0

ある種の戦略パターンまたはファクトリー パターンを使用します。

// loop through tokens
while (tokenizer.hasMoreTokens()) {
    DrawerFactory factory = 
         AbstractProgramFactory.getFactory(tokenizer.nextToken());
    factory.process(tokenizer);
}

次に、AbstractProgramFactory.getFactory は if/else の動作を持ち、コマンドの実行方法を知っている実装を返します。

interface DrawerFactory{
    void process(final Tokenizer tokenizer);
}
于 2013-10-10T14:27:07.940 に答える