0

ユーザーからの入力を必要とし、それをさまざまなデータ構造(リンクリストの配列、スタックなど)に格納する宿題があります。しかし、私は以前の宿題のメインクラスとこれを非常によく似た方法で書いています。私は非常に小さな主な方法を持っています。主な方法は、破棄したくない新しいオブジェクトをインスタンス化してから、ユーザーが別の方法を選択するまでプログラムを永久にループすることだけです。次にmenu()、選択範囲のリストを出力し、ユーザーの選択範囲を読み取るメソッドがあります。そして、そこから、その選択を別のメソッドに渡します。このメソッドは、選択を解釈し、それに応じて実行します。

私が過去の任務で抱えていた問題は、今では本当に良い答えを得ることができませんでした。問題は私のmenu()メソッド、より具体的にはScannerオブジェクトにあるようです。nextLine()スキャナーオブジェクトでメソッドを呼び出した後、ストリームにジャンクが残っているようです。したがって、次にmenu()メソッドが呼び出されると、そのジャンクが読み込まれ、3回目に呼び出されるまで、そのジャンクを含むプログラムの残りの部分がループされますmenu()next()以前は、入力を受け取った直後にメソッドを呼び出して無視することで、これを修正していました。ただ、今も問題があるようです。

特にこのプログラムでは、ユーザーが都市名を入力するように要求するメソッドがあります。現在、都市名は複数の単語にすることができます(パームシティ、ウェストパームビーチ、サテライトビーチ、ニューヨークなど)。これで、スキャナーがこれらのマルチワード都市の1つを読み取ると、以前と同じように実行され、次に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();
    }

}
4

1 に答える 1

0

スキャナのデフォルトのデリミネータは ですwhite spaceNew Yorkそのため、スキャナーが入ったので入力するwhite spaceと、 を呼び出すと、スキャナーはそれを 2 つのトークンとして扱いますnext()

より良いオプションは、そのような値を読み取るためにnextLine()メソッドを使用することです。

于 2012-10-06T03:58:25.823 に答える