2014-02-11 109 views
0

如果有人能幫助理解我在這個邏輯中做錯了什麼,我將不勝感激。我有一個提示用戶輸入名字的函數,然後運行一個for循環來查看是否有數組匹配。我能夠搜索並找到記錄,我的問題是,只要包含「else語句」,「if語句」就會停止工作。我感謝你的幫助。使用for循環搜索數組中的字符串。我做對了嗎?

代碼:

public static void SearchByName(){ 
    Scanner input = new Scanner(System.in);  
    String answer; 
    String name; 

    System.out.println(""); 
    System.out.println("\nEnter Name: "); 
    name = input.next(); 

    for(int i = 0; i < counter; ++i){ 

     if(records[i].str1.equals(name)){ 
      System.out.println("MATCHES FOUND: " + i); 
      break; 
     } 
     else 
     { 
      System.out.println("NO MATCHES FOUND"); 
      break; 
     } 

    } 

    //PROMPT USER FOR MAIN MENU 
    System.out.println(""); 
    System.out.println("\nPress \"m\" for SEARCH MAIN MENU"); 

    input = new Scanner(System.in); 
    answer = input.next(); 

    if(answer.equals("m")){ 
     doMainMenu(); 
    } 


}//METHOD 
+2

您需要遍歷所有數組以查看是否有一個元素匹配。你爲什麼在你身上打破你的循環?如果第一個元素不是您搜索的元素,您將打破您的for循環,不搜索其他元素。 –

+0

你是否應該輸出你找到的匹配,或者你找到的匹配數量? – Jason

+0

如果第一個元素不匹配,你在做的錯誤是在「else」中的循環中突然出現;所以你永遠無法比較第二個元素。 –

回答

2
boolean found = false; 
for(int i = 0; i < counter; ++i){ 

    if(records[i].str1.equals(name)){ 
     System.out.println("MATCH FOUND"); 
     found = true; 
     break; 
    } 

} 
if(!found) { 
    System.out.println("NO MATCHES FOUND"); 
} 
+0

另外,您是否希望搜索區分大小寫或不區分大小寫?目前它是區分大小寫的。 – Jason

+0

如果搜索不區分大小寫,那將會很棒。你的代碼是一個非常大的幫助。我剛剛學會了如何去做這種搜索。我如何進行不區分大小寫的搜索? – Combustion007

+0

使用.equalsIgnoreCase(name)而不是.equals(name) – Jason

0

試想一下,第一個陣列位置的字符串不以你正在尋找的名稱相匹配,所以else語句將被執行。如果你在其他地方有break,它將停止循環。

+0

謝謝你的幫助,Toni。 – Combustion007

2

您的for循環將在第一次停止equals方法將返回false。

例如,如果在數組[Alice,Tod,Bob]中搜索「Bob」,則第一個equals評估將返回false,並且循環在中斷處結束。 只有當「Bob」是數組的第一個元素時它纔有效。

爲了解決這個問題,你可以將else語句中的break替換爲continue。請注意,在這種情況下,只有元素的第一個索引可能會返回(如果數組中存在多個相同String的情況)。

+0

謝謝你的幫助,Zelus。 – Combustion007

0

您的代碼中的for循環中的問題。關鍵詞中斷,意味着停止循環;

for(int i = 0; i < counter; ++i){ 
     if(records[i].str1.equals(name)){ 
      System.out.println("MATCHES FOUND: " + i); 
      break; 
     } 
     else 
     { 
      System.out.println("NO MATCHES FOUND"); 
      break; 
     } 
    } 

環路作爲break而不管records[i].str1.equals(name)結果稱爲將僅被執行一次。

只要刪除第二個休息,代碼就會運行。

提示: 匹配未找到的消息應在所有可能的匹配ware檢查時顯示。

0

你做錯了什麼是你的else語句打破了你的for循環,如果你正在尋找的名稱不在你的數組的第一個索引。即使您刪除中斷,每次嘗試失敗後都會打印出「不匹配」。在我看來,你應該從你的for循環中完全移除else語句,並將你的打印函數放在for循環後面,這樣case名字不在數組內,或者如果你想把它保存在for循環中,你可以這樣做:

for(int i = 0; i < counter; ++i){ 

     if(records[i].str1.equals(name)){ 
      System.out.println("MATCHES FOUND: " + i); 
      break; 
     } else if (i == counter-1) { 

      System.out.println("NO MATCHES FOUND"); 

     } 

    } 

這樣的循環在整個領域,如果該人的名字傳遞是連在外地它會打印出「未找到匹配」的最後一個索引。希望我的評論能幫助你理解你做錯了什麼。如果您有任何其他問題,請隨時提問。