Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA:如何使用扫描仪将数据输入哈希表?_Java_Hashtable - Fatal编程技术网

JAVA:如何使用扫描仪将数据输入哈希表?

JAVA:如何使用扫描仪将数据输入哈希表?,java,hashtable,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()){

我希望能够在扫描仪中输入(姓名、年龄)并将其存储在哈希表中。到目前为止,进展并不顺利

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);
        }
    }
publicstaticvoidmain(字符串[]args){
Hashtable name=新的Hashtable();
扫描仪输入=新扫描仪(系统输入);
while(在.hasNext()中){
字符串名称=in.nextLine();
int age=in.nextInt();
姓名。填写(姓名、年龄);
}
}

Java doc这样说是关于
Scanner.hasnext

public boolean hasNext()
如果此扫描仪的输入中有另一个令牌,则返回true。此方法在等待输入扫描时可能会阻塞。扫描仪不会超过任何输入

因此,您的程序正在.hasNext()中等待

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

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

//获取控制台输入
如果此扫描器有其他扫描器,则public boolean hasNext()返回true 输入中的令牌。此方法在等待输入时可能会阻塞 扫描扫描仪不会超过任何输入

问题是,您从未收到任何输入,因为您的循环条件从未得到解决。您的程序在(in.hasNext())时卡在

例如,您可以选择一个将结束程序的单词,如字符串“end”,并以这种方式停止循环。(另一个例子是使用age的负值来停止循环)

publicstaticvoidmain(字符串[]args){
Hashtable name=新的Hashtable();
字符串名称=”;
int年龄=0;
扫描仪输入=新扫描仪(系统输入);
while(true){
System.out.println(“输入名称:”);
name=in.next();
如果(名称等于(“结束”)){
打破
}
System.out.println(“输入年龄:”;
age=Integer.valueOf(in.next());
姓名。填写(姓名、年龄);
}
//打印哈希表数据
System.out.println(“\n表格:\n”);
for(字符串n:names.keySet()){
System.out.println(“Name:\t”+n+“\nAge:\t”+names.get(n)+”\n”);
}
}

如果要将下一个令牌作为字符串读取,则应使用
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());
    }
} 
private静态最终字符串EXIT\u关键字=“EXIT”;
公共静态void main(最终字符串[]args){
Hashtable name=新的Hashtable();
扫描仪输入=新扫描仪(系统输入);
while(在.hasNext()中){
字符串名称=in.next();
if(EXIT_关键字等于(name)){
打破
}
int age=in.nextInt();
姓名。填写(姓名、年龄);
}
for(Map.Entry:names.entrySet()){
System.out.println(entry.getKey()+“”+entry.getValue());
}
} 

如果允许您选择另一种漂亮的输入格式,请尝试以下操作:
使用如下输入格式:
用户1:23用户2:33用户3: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);

}
publicstaticvoidmain(字符串[]args){
//TODO自动生成的方法存根
Hashtable students=新Hashtable();
扫描仪输入=新扫描仪(系统输入);
String line=in.nextLine();
String[]entries=line.split(\\s+);
for(字符串e:条目){
如果(e.contains(“:”){
String[]elements=e.split(“:”);
put(元素[0],Integer.parseInt(元素[1]);
}
}
系统输出打印(学生);
}

我可以在一个hashmap中添加多个值吗?是的,你可以,看看@Daniel's或我的答案。正如你所提到的,在新输入可用之前,该方法是阻塞的。插入新输入时,条件的计算结果为true,因此程序不再阻塞。问题不是从那里来的。如果你认为这是复制/粘贴,请在这里附加一个链接。对于这种要求,我首先想到的是[key1:value1 key2:value2]。至于代码本身实际上是3分钟的事情,不需要搜索解决方案
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);

}