2014-09-03 44 views
2

我希望能夠在(姓名,年齡)中輸入掃描器並將其存儲在散列表中。到目前爲止它進展不順利。如果此掃描器的輸入中有另一個標記,JAVA:如何使用掃描儀將數據輸入到Hashtable?

public static void main(String[] args) { 
    Hashtable<String, Integer> names = new Hashtable<String, Integer>(); 
    Scanner in = new Scanner(System.in); 
     while(in.hasNext()){ 
      String name = in.nextLine(); 
      int age = in.nextInt(); 
      names.put(name, age); 
     } 
    } 
+2

什麼是錯誤? – 2014-09-03 08:55:19

+0

我可以將多個值添加到單個哈希映射嗎? – seriallchiller 2014-09-03 09:04:53

+1

是的,你可以,看@ Daniel或我的答案 – nem035 2014-09-03 09:17:40

回答

1

如果你想下一個標記將被解讀爲一個字符串,你應該使用next()方法,而不是nextLine()。按照您的想法,nextLine()返回被跳過的行,而不是當前行。

從nextLine()的javadoc:

此掃描器執行當前行,並返回跳過的輸入信息。此方法返回當前行的其餘部分,排除末尾的任何行分隔符。該位置設置爲下一行的開頭。 由於此方法繼續在輸入中搜索以查找行分隔符,因此如果沒有行分隔符存在,它可能會緩存搜索要跳過的行的所有輸入。

返回: 這是跳過

更改行:

String name = in.nextLine();

String name = in.next();將解決您的問題。這就是你必須要做的。

此外,您需要一些條件來結束讀取輸入。您可以使用某種關鍵字,並且當讀取該關鍵字時,您知道是時候結束閱讀輸入。

這裏完整和測試的例子:

private static final String EXIT_KEYWORD = "exit"; 


public static void main(final String[] args) { 
    Hashtable<String, Integer> names = new Hashtable<String, Integer>(); 
    Scanner in = new Scanner(System.in); 
    while (in.hasNext()) { 
     String name = in.next(); 
     if (EXIT_KEYWORD.equals(name)) { 
      break; 
     } 
     int age = in.nextInt(); 
     names.put(name, age); 
    } 

    for (Map.Entry<String, Integer> entry : names.entrySet()) { 
     System.out.println(entry.getKey() + " " + entry.getValue()); 
    } 
} 
0

的Java醫生說這個約Scanner.hasnext

public boolean hasNext() 

返回true。此方法可能會在等待輸入進行掃描時阻塞。掃描儀不會超過任何輸入。

所以,你的程序等待在in.hasNext()

您可以使用簡單的循環與一些退出條件採取輸入從控制檯

for(;<exit condition>;) 
    // get console inputs 
+0

正如你所提到的,這個方法被阻塞,直到有新的輸入可用。當你插入新的輸入時,條件評估爲true,所以你的程序不再被攔截。問題不是來自那裏。 – Daniel 2014-09-03 09:14:54

1

公共布爾hasNext()返回true,如果此掃描器有另一個其輸入中有令牌 。此方法可能會在等待輸入到 掃描時阻止。掃描儀不會超過任何輸入。

問題是,您永遠不會收到任何輸入,因爲您的循環條件永遠不會得到解決。你的程序被卡住了while(in.hasNext())

例如,你可以選擇一個詞來結束你的程序,比如字符串「end」,然後停止循環。 (另一個例子是使用負值年齡停止循環)

public static void main(String[] args) { 
    Hashtable<String, Integer> names = new Hashtable<String, Integer>(); 
    String name = ""; 
    int age = 0; 
    Scanner in = new Scanner(System.in); 
    while (true) { 
     System.out.println("Enter name:"); 
     name = in.next(); 
     if (name.equals("end")) { 
      break; 
     } 
     System.out.println("Enter age:"); 
     age = Integer.valueOf(in.next()); 
     names.put(name, age); 
    } 

    // print the hashtable data 
    System.out.println("\nHashtable:\n"); 
    for(String n : names.keySet()) { 
     System.out.println("Name:\t" + n + "\nAge:\t" + names.get(n) + "\n"); 
    } 
} 
0

如果你被允許選擇輸入格式一個漂亮的方式,請試試這個:
使用輸入格式是這樣的:
USER1: 23 USER2:33用戶3:47
輸出:
{用戶3 = 47,用戶2 = 33,用戶1 = 23}

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    Hashtable<String, Integer> students = new Hashtable<String, Integer>(); 
    Scanner in = new Scanner(System.in); 
    String line = in.nextLine(); 
    String[] entries = line.split("\\s+"); 
    for(String e : entries){ 
     if(e.contains(":")){ 
      String[] elements = e.split(":"); 
      students.put(elements[0], Integer.parseInt(elements[1])); 
     } 
    } 
    System.out.println(students); 

} 
+0

如果你認爲它是一個複製/粘貼,請在這裏附上一個鏈接。對於這種需求,首先想到的就是[key1:value1 key2:value2]。至於代碼本身真的是3分鐘的事情,無需爲此搜索解決方案。 :) – eric 2014-09-03 09:37:03