2013-06-03 51 views
1

我正在嘗試同時接受兩個數組的輸入。原因是數組中每個位置的數據都是相應的,例如。姓名和身份證號碼。並行數組,接受多個輸入

String[] arr = new String[5]; 
    int[] arr1 = new int[5]; 

    Scanner kb = new Scanner(System.in); 
    for(int i = 0; i<5; i++) 
    { 
     System.out.println("Enter a name:"); 
     arr[i] = kb.nextLine(); 
     System.out.println("Enter an ID:"); 
     arr1[i] = kb.nextInt(); 
    } 

我有這樣的代碼,到目前爲止,但每當我運行它,它要求一個名稱和ID一次,然後詢問雙方,但只有接受ID。

我似乎無法弄清楚爲什麼它不允許輸入名稱,它只是返回一個不兼容的數據類型錯誤。

+1

對於這樣的兩個數組,我建議使用一個Map(http://docs.oracle.com/javase/6/docs/api/java/util/Map.html),它允許你有一個鍵(比如ID)和一個值(如名稱) –

+3

[在nextXXX之後使用nextLine時發生掃描程序問題]的可能重複(http://stackoverflow.com/questions/7056749/scanner-issue-when-using-nextline-after-nextxxx) – assylias

回答

5

從第二次迭代你的kb.nextLine()讀取的名字吞下\n輸入的新行字符輸入ID整數。

實際問題是nextInt()char令牌不是數字令牌,所以他們留在stdin。每當其他方法嘗試讀取stdin該方法採用該輸入時。 nextLine方法返回後\n,因此問題。

所以改變這樣的代碼:

String[] arr = new String[5]; 
     int[] arr1 = new int[5]; 

     Scanner kb = new Scanner(System.in); 
     for(int i = 0; i<5; i++) 
     { 
      System.out.println("Enter a name:"); 
      arr[i] = kb.nextLine(); 
      System.out.println("Enter an ID:"); 
      arr1[i] = kb.nextInt(); 
      kb.nextLine(); //now this swallows new line 
     } 

或者你可以使用兩臺掃描儀:如果你想應該是沒有關係的,例如給它們輸入...沒有衝突不是在所有...我不知道這是否效率不高。

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.util.*; 

public class Tester { 

public static void main(String[] args) throws Exception { 

String[] arr = new String[5]; 
     int[] arr1 = new int[5]; 

     Scanner kb = new Scanner(System.in); 
     Scanner bc=new Scanner(System.in); 
     for(int i = 0; i<5; i++) 
     { 
      System.out.println("Enter a name:"); 
      arr[i] = kb.nextLine(); 
      System.out.println("Enter an ID:"); 
      arr1[i] = bc.nextInt(); 
     }} 
} 
+0

非常感謝。我現在看到,它正在閱讀標準輸入。而不是等待用戶輸入,因此只跳過ID。 –

+0

@ShivekSukdeo我認爲這將不會是這樣,如果你使用兩臺掃描儀 – pinkpanther

0

你得到了你的行爲描述,因爲nextInt()只讀完下一行的下一個整數,而不是行的剩餘部分(裏面是空的。)所以,當循環回來周圍和nextLine()方法被調用時,它會拾取(空)行的其餘部分。您應該在循環結束時添加kb.nextLine()方法,然後按照您的描述進行操作。

但是,像這樣的並行數組輸入數據並不是最好的實踐 - 您應該創建一個自定義類,然後將數組類型作爲該類,或者使用ID映射到名稱。

+1

感謝,我通常只是創建一個包含所有的具體數值並將其輸入到數組,但要求兩個數組的具體問題的對象。一會兒就讓我失望了。 –

0

對我來說,這聽起來像換行符仍保存在輸入緩衝器的kb.nextInt()調用後,所以,當你調用kb.nextLine()它讀取這個換行符(爲空字符串,因爲nextLine()功能將在第一站換行符遇到,所以你的程序會要求你下一個ID。
有效地跳過任何後續時間要求的名稱。

kb.nextInt()電話後直接我可能會加入另一個kb.nextLine()調用清除\ n(換行符)字符來自緩衝區。

+0

這就是@pinkpanther所說的。 – DerMike

+0

看起來像他擊敗了我:) – Antix

相關問題