将多个字符串扫描到ArrayList会返回意外结果。 (Java,简单,初学者)

时间:2017-05-15 13:34:59

标签: java arraylist

这是我的意思代码:

public class ArrayTest {
    private static ArrayList<String> atf() {
        ArrayList<String> array = new ArrayList<>();

        while(true) {
            Scanner i = new Scanner(System.in);
            String input = i.next();

            System.out.println(input);

            array.add(input);

            System.out.println("Here i am!");

            if(i.next().equals("exit")) {
                System.out.println("Cyka");
                break;
            }
        }

        return array;
    }

    public ArrayTest() {
        System.out.println(atf().toString().replace('[', ' ').replace(']', ' '));
    }
}

我只得到一些输入来触发&#34;我来了!&#34;。 我真的很困惑为什么每隔一秒左右的输入都会被添加到ArrayList中。作为一个完整的初学者,我希望问题不是太明显,你们可以帮助我。 很多问候。

在初步反馈后进行修改:

public class ArrayTest {
private static ArrayList<String> atf() {

    ArrayList<String> array = new ArrayList<>();
    Scanner i = new Scanner(System.in);

    while(i.hasNext() && !(i.next().equals("exit"))) {

        System.out.println(i.next());
        String string = i.next();
        array.add(string);
    }   
    i.close();

    return array;
}

public ArrayTest() {
    System.out.println(atf().toString().replace('[', ' ').replace(']', ' '));
}

每隔3&#34;字符串&#34;将被打印出来。 这些变化好吗?

1 个答案:

答案 0 :(得分:2)

仅添加每一秒输入的原因是其他输入被“退出”检查所消耗。

你应该这样写:

try (Scanner i = new Scanner(System.in)) {
    List<String> list = new ArrayList<>();
    while (true) {
        String next = i.next();

        list.add(next);

        if ("exit".equals(next)) {
            System.out.println("Cyka");
            break;
        }
    }
    return list;
}

这里最大的区别是Scanner.next()只被调用一次,而不是两次。这就是为什么每个输入都被添加到列表中,而原始代码“丢弃”为“退出”检查记录的输入。

在try语句中创建扫描程序将确保它在结束时关闭。