JAVA:如何使用扫描仪将数据输入Hashtable?

时间:2014-09-03 08:54:10

标签: 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);
        }
    }

4 个答案:

答案 0 :(得分:1)

  

public boolean 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");
    }
}

答案 1 :(得分: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());
    }
} 

答案 2 :(得分:0)

Java doc说明了Scanner.hasnext

public boolean hasNext()

如果此扫描器的输入中有另一个标记,则返回true。在等待输入扫描时,此方法可能会阻塞。扫描仪不会超过任何输入。

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

您可以使用带有一些退出条件的简单循环来从控制台

获取输入
 for(;<exit condition>;)
     // get console inputs 

答案 3 :(得分:0)

如果您被允许为输入格式选择另一种漂亮的方式,请尝试这样:
使用如下输入格式:
user1:23 user2:33 user3:47
输出:
{user3 = 47,user2 = 33,user1 = 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);

}