2017-05-08 80 views
1
public static void choice(String arrayString[], double arrayReal[]) 
{ 
    int choice; 
    Scanner sc = new Scanner(System.in); 
    System.out.println("1.display mark"); 
    System.out.println("2.exit"); 
    choice = sc.nextInt(); 



    while (choice !=2 && choice != 1) 
    { 
     System.out.println("invalid input enter again"); 
     choice = sc.nextInt(); 
    } 

    switch (choice) 
    { 
      case 1: 
       output(arrayString, arrayReal); 
       break; 
      case 2: 
       System.out.println("exiting"); 
       break; 
      default: 
       System.out.println("invalid choice choose between 1 and 2"); 
       choice = sc.nextInt(); 
    } 




} 

public static void output(String arrayString[], double arrayReal[]) 
{ 
    String name; 
    Scanner sc = new Scanner(System.in); 
    for (int i=0;i<arrayString.length;i++) 
    { 
     System.out.println(arrayString[i]); 
    } 
    System.out.println("enter stident name"); 
    name = sc.nextLine(); 
    for (int k=0;k<arrayString.length;k++) 
    { 
     if(!arrayString.equals(name)) 
     { 
      System.out.println("invalid name"); 
      choice(arrayString, arrayReal); 
     } 
    } 

    for (int j=0;j<arrayString.length;j++) 
    { 
     if (arrayString[j].equals(name)) 
     { 
      System.out.println("mark of " + arrayString[j] + "is " + arrayReal[j]); 
     } 
    } 

即時嘗試驗證學生名稱,如果它不等於數組中的任何名稱返回到菜單。它會返回菜單,但問題在於返回到菜單後,即使我輸入了正確的學生姓名,如果keps返回菜單。我認爲循環應該循環設置次數並傳遞給下一個代碼?是對的嗎?我的方法也正確嗎?如果在最後的for循環中嘗試過,但是這並沒有結束,因爲我也想要它。任何幫助表示讚賞謝謝!for循環 - 循環超過其應該?

EDIT- 感謝您發現錯誤。固定arrayString.equals(名稱)arrayString [K] .equals(名稱),但仍是同樣的問題

+0

''如果< - 你是比較數組' arrayString'轉換爲String名稱。他們永遠不會平等。 –

+1

我真的不知道其餘的代碼,但是這個'if(!arrayString.equals(name))'將總是'true',因爲你正在比較'String'和'String [ ]'。可能你的意思是'if(!arrayString [k] .equals(name))'(這也會導致問題,因爲除非數組中的所有字符串相同,否則其中一個將失敗)。 – SJuan76

回答

2

你的問題在這裏IST:!

for (int k=0;k<arrayString.length;k++) 
{ 
    if(!arrayString.equals(name)) 
    { 
     System.out.println("invalid name"); 
     choice(arrayString, arrayReal); 
    } 
} 

您有String name比較數組String[] arrayString。他們永遠不會被視爲平等的,因此你的方法總是被稱爲choice。 此外,整個循環完全沒有意義,因爲您從不使用循環索引k進行任何操作。

根本不需要循環。相反,你可以將字符串數組簡單地轉換到一個臨時目錄,並檢查它是否包含你輸入:

if(!Arrays.asList(arrayString).contains(name)) 
{ 
    System.out.println("invalid name"); 
    choice(arrayString, arrayReal); 
} 

編輯:

這裏很短的主要方法,其可用於測試:

public static void main(final String[] args) { 
    final String[] test = { "Mark", "Peter" }; 
    final double[] test2 = { 1, 2 }; 
    choice(test, test2); 
} 

輸入/輸出:

OUTPUT: 1.display mark 
OUTPUT:2.exit 
INPUT: 1 
OUTPUT: Mark 
OUTPUT: Peter 
OUTPUT: enter stident name 
INPUT: Mark 
OUTPUT: mark of Markis 1.0 
+0

我改變了我的代碼,但它仍然有同樣的問題@ OH GOD SPIDERS –

+0

適合我。請記住,比較區分大小寫。所以如果你的名單中有一個名字「Peter」,你不能在搜索中鍵入「peter」。我將添加一個用於測試的主要方法。 –

0

邏輯在這個部分,加入指數後,仍然是錯誤的:

for (int k=0;k<arrayString.length;k++) 
{ 
    if(!arrayString[k].equals(name)) 
    { 
     System.out.println("invalid name"); 
     ... 
    } 
} 

這將在不特定名稱的列表,每一個名字打印「無效的名稱」。例如:如果數組中的第一個名字不匹配,那麼無論第二個條目是否匹配,您都會收到一條消息(並選擇調用)。

的方法之一是,直到找到名稱搜索整個數組,然後對結果Act:(!arrayString.equals(名稱))

boolean found = false; 
for (int k=0;k<arrayString.length;k++) 
{ 
    if(arrayString[k].equals(name)) 
    { 
     found = true; 
     break; // stop searching 
    } 
} 

if (!found) 
{ 
    System.out.println("invalid name"); 
    choice(arrayString, arrayReal); 
}