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

Какая ошибка? –

+0

Могу ли я добавить несколько значений в один хэш-файл? – seriallchiller

+1

да, вы можете, посмотрите на @ Daniel или мой ответ ниже – nem035

ответ

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() 

Возвращает истину, если этот сканер имеет еще один маркер в его входе. Этот метод может блокироваться, ожидая ввода для сканирования. Сканер не продвигается мимо какого-либо входа.

Так что ваша программа ждет на in.hasNext()

Вы можете использовать простой цикл с некоторым условием выхода принимать входные сигналы от пульта

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

Как вы уже упоминали, метод блокируется до тех пор, пока не будет доступен новый вход. Когда вы вставляете новый вход, условие оценивается как true, поэтому ваша программа больше не застревает. Проблема не возникает. – Daniel

1

общественного логического hasNext() Возвращает истину, если этот сканер имеет другой токен на входе. Этот метод может блокироваться при ожидании ввода в . Сканер не продвигается мимо какого-либо входа.

Проблема в том, что вы никогда не получаете никакого ввода, потому что ваше условие цикла никогда не будет разрешено. Ваша программа застряла в while(in.hasNext())

Вы могли бы, например, выбрать слово, которое закончит вашу программу, например, «конец» и остановит цикл таким образом. (Другой пример будет использовать отрицательное значение для возраста, чтобы остановить цикл)

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 пользователь2: 33 user3: 47
Выход:
{user3 = 47, пользователь2 = 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); 

} 
+0

Если вы считаете, что это копия/вставка, пожалуйста, прикрепите сюда ссылку. Для такого требования сначала придумайте, как [key1: value1 key2: value2]. Что касается самого кода, это действительно 3 минуты, не нужно искать решение для этого. :) – eric

Смежные вопросы