while循环再次启动后不要求输入

时间:2014-02-28 11:04:40

标签: java while-loop

我的程序是输入子字符串并根据搜索返回所有书籍。我想再次要求用户再次从相同的记录中搜索。代码不是第二次要求用户输入.Kindly帮助

    boolean runnable=true;
        while(runnable)
        {
            System.out.println("\n\nInput Books you wish for search");
            String search;
            search=br.nextLine();   


            System.out.println("\n\nBooks by your search");

            for(int i=0;i<noOfrecords;i++)
            {
            if(books[i].toLowerCase().contains(search.toLowerCase()))
            {

                System.out.println(books[i]);

            }
            }

            System.out.println("\n\nMore Books");
            for(int i=0;i<noOfrecords;i++)
            {

            if(!(books[i].toLowerCase().contains(search.toLowerCase())))

            {

                System.out.println(books[i]);
            }
            }

            System.out.println("do you wish to search again from the same records?? (y/n)");
            char searchagain=br.next().charAt(0);
            if(searchagain!='y')
            {
                runnable=false;
            }
            else if(searchagain=='y')
            {
                runnable=true;
            }

        }

4 个答案:

答案 0 :(得分:0)

因为您无法从控制台读取单个字符 - System.in,因为在按下Enter键后流中有新字节可用。

非常有用:

答案 1 :(得分:0)

我对你的代码做了一点改动。

public void searchMethod(List<String> books){
            Scanner scanner = new Scanner(System.in);
            System.out.println("\n\nInput Books you wish for search");
     //this code is executed when books is null, so first time you can invoke that method passing as argument simply null.
     if(books == null){
              while(scanner.hasNext())
                books.add(scanner.nextLine());  
      }

            System.out.println("\n\nBooks by your search");

            for(String book : books)
            {
            if(book.toLowerCase().contains(search.toLowerCase()))
            {

                System.out.println(book);

            }
            }

            System.out.println("\n\nMore Books");
            for(String book:books)
            {

            if(!(book.toLowerCase().contains(search.toLowerCase())))

            {

                System.out.println(book);
            }
            }

            System.out.println("do you wish to search again from the same records?? (y/n)");
            char searchagain=scanner.nextLine();
            if(!searchagain.equals("y"))
            {
                 return;

             }
            else if(searchagain.equals("y"))
            {
                searchMethod(books);

            }

        }
}

答案 2 :(得分:0)

我确信你的缓冲区中有一个额外的未使用的新行字符。通过在else-if

之后的while循环末尾添加一行来消费它
   else if(searchagain=='y')
        {
            runnable=true;
        }    
   br.nextLine();

在键入第一个输入后按Enter键时,Scanner.nextLine()使此扫描程序超过当前行并返回跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。所以,行分隔符\n仍然在缓冲区中,这是在第二次迭代循环时消耗的。我们需要通过在while循环结束时调用br.nextLine();来有目的地使用它。将新行字符\n留在空中并进行第二次循环以获得新输入。这将使它停止并第二次获得输入。

让我以简单的方式向您解释。您的程序要求

  

输入您想要搜索的图书

现在,您提供Effective Java并按Enter键。这将成为

  

EffectiveJava \ n

输入结尾的

\n(未使用的字符)将不会被br.nextLine()使用。因此,我们需要在while循环结束时明确地删除它。因此,\n在第二次循环期间不会消耗br.nextLine()并且它会询问您的输入

答案 3 :(得分:0)

将next()。charAt(0)更改为nextLine()。charAt()。它会工作。我认为这是下一个原因()通过空格对令牌进行处理,并从缓冲区中逐个读取令牌并保持在该行。当next()到达行尾时,如果你调用nextLine(),则nextLine()遇到行尾,nextLine()返回空行。

char searchagain = br.next()。charAt(0); 至 char searchagain = br.nextLine()。charAt(0);