文件阅读器的用户输入

时间:2015-12-17 13:30:38

标签: java

不确定标题是否有用,但我目前很困惑,不知道如何解决我的问题。

我试图向用户请求,目的地,最长时间段(格式为HH:MM)和最大数量的更改,这是我迄今为止所做的。然后应计算每个旅程的总分钟数以及更改数量,然后将其与用户的标准进行比较,我最近编辑了我的程序以使用case语句。

它确实链接到包含以下数据的.txt文件:

York
1
60
60

Alnwick
0
130

Alnwick
2
30
20
20

因此,我的程序要求提供目的地,约克或阿尼克,以及一些更改,最长时间等等,但我无法弄清楚如何使其适用于所选目的地,当前的代码可以遵循:

    import java.io.FileReader;
import java.util.Scanner;

public class InputOutput {
    public static void main(String[] args) throws Exception {
        // these will never change (be re-assigned)
        final Scanner console = new Scanner(System.in);
        final Scanner INPUT = new Scanner(new FileReader("C:\\Users\\Luke\\workspace\\Coursework\\input.txt"));

        System.out.print("-- MENU -- \n");
        System.out.print("1: Blahblahblah \n");
        System.out.print("2: Blahblahblah \n");
        System.out.print("Q: Blahblahblah \n");
        System.out.print("Pick an option: ");

        int option = console.nextInt();

        switch(option) {
            case 1 : 
                while(INPUT.hasNextLine()) {
                    System.out.println(INPUT.nextLine());
                }
               break; 

            case 2 :

                    System.out.print("Specify desired location: ");
                    String destination = console.next();

                    System.out.print("Specify Max Time (HH:MM): ");
                    String choice = console.next();

                    // save the index of the colon
                    int colon = choice.indexOf(':');

                    // strip the hours preceding the colon then convert to int
                    int givenHours = Integer.parseInt(choice.substring(0, colon));
                    // strip the mins following the colon then convert to int
                    int givenMins = Integer.parseInt(choice.substring(colon + 1, choice.length()));

                    // calculate the time's total mins
                    int maxMins = (givenHours * 60) + givenMins;

                    System.out.print("Specify maximum changes: ");
                    int maxChange = console.nextInt();

                    // gui spacing
                    System.out.println();

                    int mins = INPUT.nextInt();
                    int change = INPUT.nextInt();

                    if ((mins > maxMins) || (change > maxChange))  {
                        System.out.format("Time: %02d:%02d, Changes: %d = Unsuitable \n", (mins / 60), (mins % 60), change);
                    }
                    else {
                        System.out.format("Time: %02d:%02d, Changes: %d = Suitable \n", (mins / 60), (mins % 60), change);
                    }
                    //Do stuff
                break; 

            case 3 :



            default :
                //Default case, reprint menu?

        }
    }
}

已编辑它以减少StackOverflow问题的大小,但如果需要更多代码请告诉我 - 任何进一步的帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您应该真正了解扫描仪的工作原理:

  • int Scanner.nextInt()返回下一行中出现的下一个int值。
  • String Scanner.next()返回由默认分隔符(空格" ")分隔的下一个字符串。 (您可以使用与Scanner.useDelimiter(String)不同的Delimiter)。在默认情况下,这将返回下一个单词。
  • String Scanner.nextLine()返回以"\n"字符分隔的下一个完整行。

因此,如果您想获得一个目的地,其中有两个单词用于示例“纽约”,您可以像使用Scanner.next()一样获取它。然后你以同样的方式花时间。您将destination="New"choice = "York"无法解析:并将崩溃。

您遇到的另一个问题是扫描仪从头到尾工作。因此,如果您选择选项1并打印输入文件中的所有输出,则会到达结尾hasNextLine() == false。意味着在此之后您无法获得任何INPUT.nextInt()。但是在那之后选择2选项时你会尝试 您的prorgamm应首先将输入文件读入一个存储所有信息的数据结构。并在进一步的过程中从那里获取它们。

您现在代码中崩溃的是您开始使用INPUT.nextInt()读取文本文件,但文本文件的第一行是York,其中没有Int值。你可以通过添加:

来修复它
[...]
System.out.println();
INPUT.nextLine();   // skips the first line which is York
int mins = INPUT.nextInt();
int change = INPUT.nextInt();
[...]