扫描程序Java问题

时间:2014-10-23 04:43:19

标签: java

我正在尝试编写一个解析我已经获得的文本文件的程序。如果它以"#"开头,我跳到下一行。如果我扫描一个低位数,我将宽度设置为该数字。如果我遇到一个单词,我会将颜色设置为该单词。如果我遇到一个更大的数字,我将x设置为第一个数字,将y设置为紧随其后的数字。使用所有这些信息,它会绘制线条。

这是我的问题。如果我在条件中执行scan.next(),它会移动到文本文件中的下一个单词/数字,即使它不符合条件,我知道它是怎么回事应该工作。 scan.nextInt()也是如此。我不知道如何在不在文本中推进的情况下检查文本文档中的下一个字符串/ int。

如果您了解我的问题,您可以尝试帮助我吗?谢谢。

package lab7;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
import java.awt.Point;
import plotter.PolylinePlotter;

public class CheckpointTwo  {
    public static void main(String[] args) throws FileNotFoundException
    {
    File file = new File("C:/Users/Nick/workspace/project7/test.txt");
    Scanner scanner = new Scanner(file);
    PolylinePlotter plotter = new PolylinePlotter();
    while (scanner.hasNextLine())
    {
      String line = scanner.nextLine();
        Scanner scan = new Scanner(line);
        String color = "";
        int width=0;

        while(scan.hasNext())
        {
            int x=0;
            int y=0;
            if(scan.next().equals("#"))
            {
                scan.nextLine();
                continue;
            }
            else if(scan.hasNextInt()==true && scan.nextInt()<10)
            {
                width=scan.nextInt();
                color=scan.next();
            }
            else if(scan.hasNextInt()==false && scan.hasNext()==true)
            {
                color=scan.next();
            }
            else if(scan.hasNextInt()==true && scan.nextInt()>10)
            {
                x=scan.nextInt();
                y=scan.nextInt();
            }
                 plotter.startLine(color, new Point(x,y));
        }
    }
}
}

3 个答案:

答案 0 :(得分:1)

您的测试条件必须

if(s.equals("#")) 

因为你已经阅读了一行并将其存储在变量String s

答案 1 :(得分:1)

  1. 确保在while循环的每次迭代中,只调用一个nextXXX方法。
  2. 编写System.out.println并打印内容。
  3. 在IDE(Eclipse)中逐步执行代码
  4. 如果您未使用IDE,请开始使用IDE。

答案 2 :(得分:1)

问题是您在if语句中使用scan.nextInt()scan.next()等。即使它在if语句中,它仍然会前进一行,因为仍然必须调用该方法才能获得返回的值。您应该做的是获取下一行并将其存储在if语句之前的变量中,然后您可以与变量而不是方法进行比较。例如:

while (scanner.hasNextLine())
{
    String line = scanner.nextLine();
    Scanner scan = new Scanner(line);
    String color = "";
    int width=0;

    while(scan.hasNext())
    {
        int x=0;
        int y=0;

        boolean isInt = scan.hasNextInt();
        String next = scan.next();

        if(next.equals("#"))
        {
            scan.nextLine();
            continue;
        }
        else if(isInt && Integer.parseInt(next) < 10)
        {
            width=scan.nextInt();
            color=scan.next();
        }
        else if(!isInt)
        {
            color=next;
        }
        else if(isInt && Integer.parseInt(next) > 10)
        {
            x=scan.nextInt();
            y=scan.nextInt();
        }
        plotter.startLine(color, new Point(x,y));
    }
}

首先我定义了两个变量:

boolean isInt = scan.hasNextInt();
String next = scan.next();

第一个变量isInt存储第二个变量next是否为intnext明确存储scan.next()。现在我们可以在if语句中使用这两个变量,我们不必担心意外调用scan.next()并推进Scanner。在您要检查next> 10还是< 10的语句中,使用Integer.parseInt(String s)String变量next变为{ {1}}。

请告诉我这是否让您感到困惑,或者它是否按预期工作,我可以提供帮助。我希望这对你有用!