因此,我的程序的要点是它将从文件中读取一些命令,然后根据命令执行某些操作。我的问题是我的代码没有读取txt文档的所有行。具体来说,它通过先前在if语句中输入print语句来读取我测试的前四行,该语句测试输入是否为“P”。任何帮助将不胜感激。
以下是txt文档
P e1 10 5
P e2 19 5
P e3 11 5
P e4 18 5
R mouth 10 10 10 2
S nose 14 7 2
P p3 9 9
P p4 20 9
D
Y bad command
M p3 9 12
M p4 20 12
D
public static void main(String[] args) {
String filename = args[0];
File file = new File(filename);
Scanner input=null;
try {
input=new Scanner(file);
}
catch(java.io.FileNotFoundException ex) {
System.out.println("ERROR: Couldn't open file: " + file);
System.exit(1);
}
AsciiDisplay asciiDisplay= new AsciiDisplay();
while(input.hasNext()) {
if(input.next().equals("P")) {
String id=input.next();
int x=input.nextInt();
int y=input.nextInt();
Coordinate coordinate=new Coordinate(x,y);
Point point=new Point(id,coordinate);
asciiDisplay.addShape(point);
}
else if(input.next().equals("R")) {
String id=input.next();
int x=input.nextInt();
int y=input.nextInt();
int length=input.nextInt();
int height=input.nextInt();
Coordinate coordinate= new Coordinate(x,y);
Rectangle rectangle= new Rectangle(id,coordinate,length,height);
asciiDisplay.addShape(rectangle);
}
else if(input.next().equals("S")) {
String id=input.next();
int x=input.nextInt();
int y=input.nextInt();
int size=input.nextInt();
Coordinate coordinate= new Coordinate(x,y);
Square square = new Square(id,coordinate,size);
asciiDisplay.addShape(square);
}
else if(input.next().equals("M")) {
String id=input.next();
int x=input.nextInt();
int y=input.nextInt();
Coordinate coordinate= new Coordinate(x,y);
asciiDisplay.moveShape(id,coordinate);
}
else if(input.next().equals("E")) {
asciiDisplay.deleteAll();
}
else if(input.next().equals("D")) {
asciiDisplay.updateGrid();
asciiDisplay.printGrid();
}
else if(input.next().equals("X")) {
System.out.println("Invalid command: X");
}
}
}
}
答案 0 :(得分:2)
您的问题是,您在input.next()
语句中反复拨打if
,这会不断提取更多令牌。相反,您需要调用一次并将值赋给变量,然后检查该变量:
String nextCommand = input.next();
或者,您可以使用开关:
switch(input.next()) {
case "P":
// do stuff
break;
case "R":
// do other stuff
break;
}
答案 1 :(得分:1)
您经常在这里经常致电input.next()
:
if (input.next().equals("P")) {
...
}
else if(input.next().equals("R")) {
...
}
else if(input.next().equals("S")) {
...
}
...
当它检查S
时,它会读取三个令牌。你需要这样的东西:
String token = input.next();
if (token.equals("P")) {
...
} else if (token.equals("R")) {
...
} else if (token.equals("S")) {
...
} ...
这样,您只需读取一次令牌,然后找到正确的代码来处理它。
请注意,从Java 7开始,您也可以使用switch
语句执行此操作:
switch (input.next()) {
case "P": {
...
break;
}
case "R": {
...
break;
}
case "S": {
...
break;
}
}
(你不 在这里有牙套,但鉴于你的块 这是非常重要的,这样做是为了引入一个 每个块的新范围。您可能需要考虑拆分代码 分别采用单独的方法......)