2014-02-28 35 views
1

我的程序是輸入一個子字符串並返回基於search.i的所有書籍,我想再次要求用戶再次從相同的記錄中搜索。代碼不問對於第二time.Kindly用戶輸入幫助在while循環再次開始後不要求輸入

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

做一件事改變搜索字符串並輸入是或否......在搜索後再次打印搜索if(searchagain.equalsIgnorecCase。(「yes」)) \t { \t runnable = true; \t}來驗證 – Naren

回答

0

我確定你的緩衝區中有一個額外的未消耗的換行符。後else-if

else if(searchagain=='y') 
     { 
      runnable=true; 
     }  
    br.nextLine(); 

通過添加while循環的最後一行消耗它。當你打鍵控第一輸入,Scanner.nextLine()此掃描器在當前行之後進入,並返回跳過的輸入信息。此方法返回當前行的其餘部分,排除末尾的任何行分隔符。因此,行分隔符\n仍然在緩衝區中,第二次迭代循環時會被佔用。我們需要通過在while循環結束時調用br.nextLine();並將新行字符\n置於空中來有目的地使用它併爲第二次循環尋找新的輸入。這將使其停止並第二次獲得輸入。

讓我以一種簡單的方式解釋你。你的程序要求你希望搜索

輸入書籍現在,你給Effective Java,然後按回車。這會在你輸入的到底會不會被br.nextLine()消耗成爲

EffectiveJava \ n

\n(未消耗焦炭)。所以,我們需要在while循環結束時明確擺脫它。因此,\n在第二個循環中將不會被br.nextLine()消耗,並且它會詢問您的輸入。

+0

thx bro!它的工作... thx很多 – user3364497

+0

很高興,它工作:)請接受讓別人知道這個問題的答案和工作的答案。 – Keerthivasan

+0

但兄弟我不明白'額外消耗的char'的東西。請你以簡單的方式解釋。這將是很大的幫助 – user3364497

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); 

      } 

     } 
} 
+0

我比「返回」更喜歡「休息」 –

+0

現在沒有時間了。我對同樣的方法進行了必要的調用。 :) – RMachnik

+0

只是開玩笑:) –

0

將next()。charAt(0)更改爲nextLine()。charAt()。它會工作。我認爲這是next()的原因是通過空格來指示令牌,並從緩衝區中逐個讀取令牌並保持在該行。當next()到達行尾時,如果你調用nextLine(),nextLine()遇到行尾,nextLine()返回空行。

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

+0

thx隊友: ).... – user3364497

+0

讓我知道你是否沒有完全清除你的懷疑。 –

相關問題