2014-10-23 3 views
2

Я пытаюсь написать программу, которая анализирует текстовый файл, который у меня есть. Если он начинается с «#», я перехожу к следующей строке. Если я сканирую низкую цифру, я устанавливаю ее ширину. Если я встречу слово, я задаю цвет этому слову. Если я столкнулся с большим числом, я устанавливаю x на первое число и y на число сразу после него. Используя всю эту информацию, он отображает линии.Scanner Java issue

Вот моя проблема. Если я выполняю 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)); 
     } 
    } 
} 
} 
+1

Вы изучали методы объекта «Сканер»? http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html искать вещи, начинающиеся с 'hasNext ...' – nem035

ответ

1

Проблема заключается в том, что вы используете scan.nextInt(), scan.next() и т.д. внутри вашего Условный оператор. Это все равно будет продвигать строку, даже если она находится внутри оператора if, потому что метод все равно должен быть вызван, чтобы получить возвращаемое значение. То, что вы должны сделать, это получить следующую строку и сохранить ее в переменной перед вашим if-statement, тогда вы можете сравнить ее с переменной, а не с методом. Например:

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, является int. next магазины scan.next(), ясно. Теперь мы можем использовать эти две переменные внутри нашего оператора if, и нам не нужно беспокоиться о случайном вызове scan.next() и продвижении Scanner. В заявлениях, в которых вы хотите проверить, next - > 10 или < 10, используйте Integer.parseInt(String s), чтобы превратить переменную String в int.

Сообщите мне, если это вас смущает, или если оно не работает должным образом, и я могу помочь. Надеюсь, это сработает для вас!

+0

Это 2:30 утра, поэтому я не буду исправлять это прямо сейчас, но я думал об одном и том же. Я подумал, что, возможно, я мог бы сделать целые строки целыми и схватить их как-то. Я только что узнал о разборе, но я не слишком хорош в этом, поэтому не был уверен, как это сделать. Я обновлю вас, если завтра не смогу исправить свою программу. Спасибо за отличный ответ, похоже, он сработает. – NewbieNick

+0

@NewbieNick Нет проблем! Дайте мне знать, как это работает для вас. Я обязательно сделаю это! –

+0

Обновление: он начинает работать. Мне пришлось добавить переменную или две и изменить некоторые вещи, но ваша идея работает. Я, наконец, получил программу, чтобы захватить информацию из файла и нарисовать ее часть, но не все это довольно давно. – NewbieNick

1

Ваш тест условие должно быть

if(s.equals("#")) 

Coz вы уже читали строку и хранить его в переменной String s

1
  1. Убедитесь, что только в каждой итерации цикла в то время, вызывается один метод nextXXX.
  2. Напишите System.out.println и напечатайте материал.
  3. Пройдите свой код в среде IDE (Eclipse)
  4. Если вы не используете IDE, начните использовать его.
+0

Да, я только что научился прохождению кода на прошлой неделе и Я использовал это. Я смог исправить несколько предыдущих ошибок, основанных на этом. Я бы распечатывал все, но мне нужно было захватывать значения и хранить их в переменной, чтобы я мог ввести их в метод, который будет строить точки.Это было бы намного проще, если бы я мог просто распечатать его * вздох * Но это важно для меня, чтобы учиться в любом случае, поэтому я рад, что мне нужно решить эти проблемы. – NewbieNick

+0

Отлично - все лучшее! – Teddy