2014-09-03 70 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