2012-10-06 2 views
0

나는 사용자의 입력이 필요하고 다양한 데이터 구조 (링크 된 목록, 스택 등의 배열)에 저장하는 숙제가 있습니다. 그러나, 나는 이전의 숙제와이 수업의 주요 수업을 비슷한 방식으로 쓰고있었습니다. 나는 아주 작은 주요 방법이있다. 모든 주된 메소드는 파괴되고 싶지 않은 새로운 객체를 인스턴스화 한 다음 사용자가 다른 방법을 선택할 때까지 영원히 프로그램을 반복합니다. 그런 다음 선택 목록을 인쇄하고 사용자 선택을 읽는 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입니다. 따라서 white space을 입력 했으므로 New York을 입력하면 next()으로 전화하면 스캐너가이를 두 개의 토큰으로 처리합니다.

더 나은 옵션은 이러한 값을 읽는 방법으로 nextLine()을 사용하는 것입니다.