Java循环播放器

时间:2015-03-30 00:03:06

标签: java arraylist while-loop java.util.scanner system.in

我正在尝试接受一个字符串输入,该输入由多行数字组成,用','和';'分隔

示例:

1,2;3,4;5,6;
9,8;7,6;
0,1;
;

代码:

ArrayList<Integer> alist = new ArrayList<>();
        String delims = ";|\\,";
        int i = 0;
        Scanner input = new Scanner(System.in);
        input.useDelimiter(delims);
        while (input.hasNext()) {
            alist.add(i, input.nextInt());
            System.out.print(i + ' ');
            System.out.print(alist.get(i) + '\n');
            i++;
        }
        System.out.print('x');

当我在日食中运行时:

1,2;3,4;5,6;    ( <= what i typed in console)
321133123413351436153716    ( <= output)                

我希望更像是:

0 1
1 2
2 3
3 4
4 5 
5 6
x

为什么我会得到这种输出?

2 个答案:

答案 0 :(得分:1)

一个问题是System.in基本上是一个无限流:hasNext将始终返回true,除非用户输入一个关闭它的特殊命令。

因此,您需要让用户输入一些信息,告诉您已完成。例如:

while(input.hasNext()) {
    System.out.print("Enter an integer or 'end' to finish: ");
    String next = input.next();
    if("end".equalsIgnoreCase(next)) {
        break;
    }

    int theInt = Integer.parseInt(next);
    ...

对于您的程序,您可能会尝试使用您检查的特殊字符1,2;3,4;5,6;end1,2;3,4;5,6;#来解析输入。

在这些方面:

System.out.print(i + ' ');
System.out.print(alist.get(i) + '\n');

看起来您正在尝试执行String连接,但由于char是数字类型,因此它会执行添加。这就是为什么你得到疯狂的输出。因此,您需要使用String代替char

System.out.print(i + " ");
System.out.print(alist.get(i) + "\n");

或者只是:

System.out.println(i + " " + alist.get(i));

编辑评论。

例如,您可以使用nextLine使用默认分隔符从Scanner提取输入,然后创建第二个Scanner来扫描该行:

Scanner sysIn = new Scanner(System.in);
while(sysIn.hasNextLine()) {
    String nextLine = sysIn.nextLine();
    if(nextLine.isEmpty()) {
        break;
    }

    Scanner lineIn = new Scanner(nextLine);
    lineIn.useDelimiter(";|\\,");

    while(lineIn.hasNextInt()) {
        int nextInt = lineIn.nextInt();
        ...
    }
}

答案 1 :(得分:0)

由于Radiodef已经回答了您的实际问题("而不是'),这里有一些我认为可能对您有帮助的指针(这更多的是评论而不是答案,但是实际评论太长了):

使用扫描程序时,请尝试将hasNextX函数调用与nextX调用匹配。即在您的情况下,请使用hasNextIntnextInt。这样就不太可能在意外输入时获得异常,同时只需键入另一个分隔符便可轻松结束输入。

扫描程序useDelimiter调用返回扫描程序,因此可以将其链接,作为扫描程序初始化的一部分。即你可以写:

Scanner input = new Scanner(System.in).useDelimiter(";|\\,");

当您添加到ArrayList的末尾时,您不需要(通常不应该)指定索引。

int i = 0i++是for循环的教科书示例。仅仅因为您的测试语句不涉及i并不意味着您不应该使用for循环。

您的代码,上述要点如下:

ArrayList<Integer> alist = new ArrayList<>();
Scanner input = new Scanner(System.in).useDelimiter(";|\\,");
for (int i = 0; input.hasNextInt(); i++) {
    alist.add(input.nextInt());
    System.out.println(i + " " + alist.get(i));
}
System.out.println('x');

编辑:只需要提一下我最喜欢的Scanner分隔符,因为它非常合适:

Scanner input = new Scanner(System.in).useDelimiter("\\D");

这将使扫描仪仅仅是数字,分裂任何不是数字的东西。结合hasNextInt,当从终端输入读取时,它也会在第一个空白行结束输入。