2012-10-06 107 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()方法讀取這些值。