在 Java 的 HashMap 中获取和打印用户输入

Getting and Printing User Inputs in HashMaps in Java

一个月前踏入Java,一直在学习。我遇到了一个问题。我需要将 N 个用户输入对 (key:value) 获取到 Java 中的 HashMap,如下面的代码所述。输入一对 key:value 后,这给了我一个 InputMismatchException。据我所知,我无法弄清楚声明的循环和将用户输入值对分配给声明的 HashMap 是否存在语法错误。如果有人能详细说明这一点,我将非常感激,希望用简单的术语,因为我是一个非常初学者。非常感谢您的关心。

public static void main (String [] arg){
    HashMap<String, Integer> phonebook = new HashMap<>();
    Scanner obj = new Scanner(System.in);
    //N= Number of contacts to be entered by the user
    int N = obj.nextInt();
    //Getting N num of user inputs for names and contacts
    while(N>0){
        for (int i=0;i<N;i++)
        {
            //we need to input name and contact value pairs
            //in same line
            String name = obj.nextLine();
            int contact = obj.nextInt();
            //assigning user input key:value pairs to hashmap
            phonebook.put(name, contact);
        }
        //setting key:value pairs to display
        Set<String> keys = phonebook.keySet();
        for(String i:keys)
        {
            System.out.println(i +"="+phonebook.get(i));
        }
        N--;
    }
}

你总是需要在 obj.nextInt(); 之后加上 obj.nextLine();。这是因为 obj.nextInt(); 只消耗数字,但是当你输入数字并按下回车键时,输入流最后还会记录一个换行符,所以接下来的 obj.nextLine(); 会拾取一个空字符串,从那以后你总是差一个。这是一个事件序列示例:

  1. 您输入输入的数量。
  2. 程序将其读入变量 N
  3. 程序将剩余的空字符串读入变量name
  4. 你输入名字。
  5. 程序试图将一个数字读入变量contact,但您输入的不是数字,因此失败。

为了您的理智,使用一些缩进。这是您更正后的代码,缩进:

public static void main(String[] arg) {
    HashMap<String, Integer> phonebook = new HashMap<>();
    Scanner obj = new Scanner(System.in);

    //N= Number of contacts to be entered by the user
    int N = obj.nextInt();
    obj.nextLine(); //consume the newline

    //Getting N num of user inputs for names and contacts
    while (N > 0) {
        for (int i = 0; i < N; i++) {
            //we need to input name and contact value pairs
            //in same line
            String name = obj.nextLine();
            int contact = obj.nextInt();
            obj.nextLine(); //consume the newline

            //assigning user input key:value pairs to hashmap
            phonebook.put(name, contact);
        }

        //setting key:value pairs to display
        Set<String> keys = phonebook.keySet();

        for (String i : keys) {
            System.out.println(i + "=" + phonebook.get(i));
        }

        N--;
    }
}

或者,如果您确实希望在评论中所说的同一行输入姓名和联系人,则可以替换此行:

String name = obj.nextLine();

这一行:

String name = obj.findInLine("\D+");

这只是告诉 Java 从输入流中读取数据,直到遇到数字字符。

你需要在得到N后添加一个obj.nextLine()语句。当你在提示中输入内容时,有一个行尾字符在你按下回车后添加(\n) . nextInt() 只读取一个数字,所以当你在 nextInt() 之后立即调用 nextLine() 时,它只会读取行尾字符 \n,因为 nextInt() 没有把它捡起来。通过在调用 nextInt() 之后添加额外的 nextLine() 语句,您可以摆脱 \n,程序可以正确读取值。

此代码有效:

public static void main (String [] arg){
    HashMap<String, Integer> phonebook = new HashMap<>();
    Scanner obj = new Scanner(System.in);
    //N= Number of contacts to be entered by the user
    int N = obj.nextInt();
    obj.nextLine();
    //Getting N num of user inputs for names and contacts
    while(N>0){
        for (int i=0;i<N;i++)
        {
            //we need to input name and contact value pairs
            //in same line
            String name = obj.nextLine();
            int contact = obj.nextInt();
            obj.nextLine();
            //assigning user input key:value pairs to hashmap
            phonebook.put(name, contact);
        }
        //setting key:value pairs to display
        Set<String> keys = phonebook.keySet();
        for(String i:keys)
        {
            System.out.println(i +"="+phonebook.get(i));
        }
        N--;
    }
}

控制台输入和输出如下。您可能想使用 i < N - 1 而不是 i < N,因为我只想输入 2 个联系人,但不得不添加 3 个。这可能会使用户感到困惑。

2
foo
100
bar
1000
bar=1000
foo=100
n
1000000
bar=1000
foo=100
n=1000000