Java 使用标记器将文本文件中的文本分解为命令-家庭作业

Java 使用标记器将文本文件中的文本分解为命令-家庭作业,java,Java,我有一个项目要交给学校,画形状,让它们移动。这个程序(我认为是最难的部分)运行得很好,但老师将使用一个文本文件来测试它。我很难打破她将要使用的命令。我使用bufferreader读取文件,然后循环遍历令牌,但这就是我感到困惑的地方。我如何将令牌分解为字符串和整数,并触发正确的方法?如能提供任何建设性指导,将不胜感激 这是我读取文件的代码 static void getTokens() throws Exception { Scanner input = new Scann

我有一个项目要交给学校,画形状,让它们移动。这个程序(我认为是最难的部分)运行得很好,但老师将使用一个文本文件来测试它。我很难打破她将要使用的命令。我使用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

我将使用某种策略或工厂模式

// 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);
}
像这样的

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]));
    }
    ...
}

你在找这样的东西吗?

这是家庭作业。。。这看起来不像是他自己想的,是吗?好吧,这取决于他学习的时间,当我上三年级的时候,我已经知道了设计模式,但他们是对的,我在编程2,最近意识到我不会从power points学习编程。这种方法可能不起作用,由于失去了上下文。它看起来像“开始图片”/“结束图片”的括号形式,带有子对象。@Ingo它已经没有被选择,所以不要在意它,如果你不分享它,你会失去上下文,这是他使用的方法,而不是一个。这是确切的做法:Pi不认为单独处理每个标记是一个好主意,我建议你一次处理整条线,因为你不能在没有坐标的情况下绘制形状,你应该在文件线上循环,这没问题,但我仍然不确定如何区分整数和字符串,第一行末尾的A或字符串必须是标识符。这比我想的更有意义。我把事情复杂化了。谢谢
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]));
    }
    ...
}