从扫描仪获取未定义的输入量

时间:2017-12-01 20:51:25

标签: java java.util.scanner

我正在制作一个搜索引擎,以查找哪个文档与用户提供的字词匹配。以下是我的代码。这是我的方法,它实际上采取用户输入,我将稍微添加到它进行搜索,但我试图测试这么多(这就是为什么它打印输出)看看它是否但仍然可以接受输入。我可以更改什么,以便它需要尽可能多的单词,直到他们留下一行空白?我让它在10点停止,但我认为hasNext()会在它们留空线时停止它,但它只是继续扫描。

    Scanner userInput = new Scanner(System.in);
    System.out.println("\n\n\nEnter the words you would like to search your documents for (up to 10):");
    String[] stringArray = new String[10];
    int i = 0;

    while (userInput.hasNext() && i < 9){//takes input until user leaves a blank line
        stringArray[i] = userInput.next();
        i++;
    }
    for (int j = 0; j < i; j++){//just for testing purposes
        System.out.println(stringArray[j]);
    }

3 个答案:

答案 0 :(得分:1)

String line;
int i = 0;
while(!(line = userInput.nextLine()).isEmpty()) {
    for (String word :line.split("\\s+")){
        stringArray[i]=word;
        i++;
    }
}

此代码将Scanner中的每一行分配给变量line,直到用户输入为空。在每次迭代中,它会将line拆分为单词并分配给stringArray

答案 1 :(得分:0)

将您的while循环更改为:

while (!(String temp = userInput.nextLine()).trim().contentEquals("")) {
    stringArray[i] = userInput.next();
    i++;
}

答案 2 :(得分:0)

hasNext()&amp; next()停止言语,而不是行。使用您的代码,用户可以将所有10个单词放在同一行上,然后就可以完成了。此外,这些方法将跳过所有空格,包括换行符,直到找到下一个单词。您无法使用hasNext()查找空行,next()永远不会返回空字符串。您想要hasNextLine()nextLine()

Scanner userInput = new Scanner(System.in);
System.out.println("\n\n\nEnter the words you would like to search your documents for (up to 10):");
String[] stringArray = new String[10];
int i = 0;

while (i < stringArray.length 
        && userInput.hasNextLine()
        && !(stringArray[i] = userInput.nextLine().trim()).isEmpty()) {
    i++;
}

for (int j = 0; j < i; j++) { // just for testing purposes
    System.out.println(stringArray[j]);
}

但为什么要限制自己只有10行?您可以使用ArrayList来获得更大的灵活性:

Scanner userInput = new Scanner(System.in);
System.out.println("\n\n\nEnter the words you would like to search your documents for:");
List<String> stringList = new ArrayList<>();
String line;

while (userInput.hasNextLine()
        && !(line = userInput.nextLine().trim()).isEmpty()) {
    stringList.add(line);
}

stringList.forEach(System.out::println); // just for testing purposes