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);
}