我的程序是输入子字符串并根据搜索返回所有书籍。我想再次要求用户再次从相同的记录中搜索。代码不是第二次要求用户输入.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;
}
}
答案 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
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);