2012-10-06 108 views
0

我有一个家庭作业,需要用户输入并将其存储在各种数据结构(链表,堆栈等数组)中。但是,我一直以类似的方式撰写我以前的家庭作业的主要类别,而这一类作业也是。我有一个非常微小的主要方法。所有主要方法都是实例化一个新的对象,我不想被销毁,然后循环遍历该程序,直到用户选择其他方式。然后我有一个menu()方法,它打印选择列表并读取用户的选择。然后从那里,我将该选择传递给解释选择并相应执行的另一种方法。扫描仪循环头痛

我一直在过去的任务中遇到的问题,现在我从来没有真正得到好的答案。问题似乎在于我的menu()方法,更具体地说,是Scanner对象。我在扫描器对象上调用nextLine()方法后,似乎总会有一些垃圾留在流中。因此,下一次调用menu()方法时,它会读取该垃圾并通过该垃圾循环执行程序的其余部分,直到menu()被称为第三次。过去,我会在收到我的输入并忽略它之后立即调用next()方法来解决此问题。不过,我现在似乎也遇到了问题。

特别是在这个程序中,我有一个请求用户输入城市名称的方法。现在,城市名称可以不止一个字(棕榈城,西棕榈滩,卫星海滩,纽约等)。现在,当扫描器读入其中一个多字城市时,它会执行与以前相同的操作,在下一次调用menu()方法时读入一些垃圾,并且通过它重新调用menu()。在这种情况下,它会打印一个字符串“Invalid Selection”,然后再次打印菜单。我不能为了我的生活而弄清楚发生了什么事。任何帮助,将不胜感激。

import java.util.Scanner; 


public class CSAir 
{ 
    public static Scanner input = new Scanner(System.in); 

    public static void main(String[] args) 
    { 
     CityList flightLog = new CityList(); 
     boolean loop = true; 

     while(loop) 
     { 
      loop = actions(menu(),flightLog); 
     } 

    } 

    private static String menu() 
    { 
     System.out.print("Please Make a Selection\n" + 
      "I) Insert a city\n" + 
      "A)Add a flight path (One Way)\n" + 
      "R) Request a flight\n" + 
      "L) Load from a text file\n" + 
      "Q) Quit\n" + 
      "\nSelection: "); 

     String in = input.next(); 
     //input.next(); 
     System.out.println(); 
     return in; 
    } 

    private static boolean actions(String selection, CityList flightLog) 
    { 
     if(selection.equalsIgnoreCase("I")) 
     { 
      insert(flightLog); 
      return true; 
     } 

     else if(selection.equalsIgnoreCase("A")) 
     { 
      add(flightLog); 
      return true; 
     } 

     else if(selection.equalsIgnoreCase("R")) 
     { 
      request(flightLog); 
      return true; 
     } 

     else if(selection.equalsIgnoreCase("L")) 
     { 
      return true; 
     } 

     else if(selection.equalsIgnoreCase("Q")) return false; 

     else 
     { 
      System.out.println("Invalid Selection!\n"); 
      return true; 
     } 
    } 

    private static void request(CityList flightLog) 
    { 
     System.out.print("Origin: "); 
     String origin = input.nextLine(); 
     System.out.print("\nDestination: "); 
     try 
     { 
      flightLog.isPath(origin, input.next()); 
     } 
     catch (AllDestinationsVisitedException e) 
     { 
      e.getMessage(); 
     } 
    } 

    private static void add(CityList flightLog) 
    { 
     System.out.print("Origin: "); 
     String origin = input.nextLine(); 
     System.out.print("\nDestination: "); 
     flightLog.addPath(origin, input.next()); 
    } 

    private static void insert(CityList flightLog) 
    { 
     System.out.print("Enter a City: "); 

     try 
     { 
      flightLog.addCity(input.next()); 
     } 
     catch(Exception e) 
     { 
      System.out.println(e.getMessage()); 
     } 
     System.out.println(); 
    } 

} 
+1

由于这是全部文本输入,因此您需要假设/指示用户在一行中输入相关数据并在每次输入一些数据时读取整行。目前,你的程序有'next()'和'nextLine()'的组合。 – nhahtdh

+0

这样做。我从来没有真正看到两者之间的区别,我猜。谢谢 – audiFanatic

回答

0

扫描仪的默认缩小器是white space。因此,如果您输入New York,因为它现在有white space扫描程序,如果您拨打next(),扫描程序会将其视为两个标记。

更好的选择是使用nextLine()方法读取这些值。