Добавление String и Integer к различным спискам ArrayLists в цикле while - PullRequest
0 голосов
/ 25 января 2019

Я застрял в упражнении, в котором я должен взять слово и цифры (разделенные пробелом), а затем поместить их в ArrayList (различные списки для чисел и имен).

Например, если я напишу «Jordan 19», имя Jordan должно быть помещено в ArrayList с именем «listNames», а число 19 должно быть помещено в ArrayList с именем «listNumbers».

Если введена буква "q", цикл while следует разорвать. Проблема, которую я получаю, состоит в том, что, когда я пытаюсь получить имя и номер из ArrayList, я получаю только пустую строку и введенный номер. Т.е. ArrayList для чисел работает, но не для имени.

Что может быть не так? Спасибо за помощь!

ArrayList<String> listNames = new ArrayList<String>();
ArrayList<Integer> listNumbers = new ArrayList<Integer>();

Scanner in = new Scanner(System.in);
System.out.println("Write a name and number (separate with blankspace), end with 'q'");

boolean go = true;
while (go) {
    String full = in.nextLine();
    if (in.next().equals("q")) {
        go = false;
    }
    int len = full.length();
    int blank = full.indexOf(" ");

    String nameString = full.substring(0, blank);
    String numberString = full.substring(blank + 1, len);
    int number = Integer.parseInt(numberString);

    listNames.add(nameString);
    listNumbers.add(number);
}

System.out.println(listNames.get(1));
System.out.println(listNumbers.get(1));

Ответы [ 6 ]

0 голосов
/ 25 января 2019

Все ответы здесь предполагают одно и то же, и это работает. Еще одно незначительное дополнение к этому,

сделать это: listNumbers.add(Integer.valueOf(data[1]));

вместо этого: listNumbers.add(Integer.parseInt(data[1]));.

Integer.parseInt() возвращает int, и вы сохраняете список Integer. Компилятор автоматически устанавливает результат для вас. Вы можете избежать этого с помощью Integer.valueOf().

0 голосов
/ 25 января 2019

ArrayLists начинаются с индекса 0. Поэтому, если вы хотите вывести первый элемент в ArrayList, вы должны написать System.out.println(listNames.get(0));

0 голосов
/ 25 января 2019

Не усложняй. введите ввод как " Jordan 19 " и удалите q во входе.

и используйте split() строки, чтобы отделить ее

String [] inputString = full.split(" "); 
listNames.add(inputString [0]);
listNumbers.add(Integer.parseInt(inputString [1]));
0 голосов
/ 25 января 2019

Вы можете разделить, а затем ввести и вставить первый и второй члены в соответствующие списки массивов. Вам также не нужно логическое значение go.

    ArrayList<String> listNames = new ArrayList<>();
    ArrayList<Integer> listNumbers = new ArrayList<>();

    Scanner in = new Scanner(System.in);
    System.out.println("Write a name and number (separate with blankspace), end with 'q'");

    while(true){
        String full = in.nextLine();
        if(full.equals("q")){
            break;
        }
        String[] data = full.split(" ");
        listNames.add(data[0]);
        listNumbers.add(Integer.parseInt(data[1]));
    }
    System.out.println("Names and numbers entered:");
    for(int i = 0; i < listNames.size(); i++){
        System.out.println(listNames.get(i) + " " + listNumbers.get(i));
    }
0 голосов
/ 25 января 2019

Я думаю, что ваша логика должна заключаться во всей строке ввода со сканера. Затем выполните проверку работоспособности, чтобы убедиться, что в ней есть только два термина, разделенных пробелами. Если это так, то присвойте слово и номер их соответствующим массивам.

System.out.println("Write a name and number (separate with blankspace), end with 'q'");
while (true) {
    String full = in.nextLine();
    if ("q".equals(full)) {
        break;
    }

    String[] parts = full.split("\\s+");
    if (parts.length != 2) {
        // you could also just break here as well, but throwing an exception
        // is something you might actually do in a production code base
        throw new IllegalArgumentException("Wrong number of input terms; use 2 only");
    }

    listNames.add(parts[0]);
    listNumbers.add(Integer.parseInt(parts[1]));
}
0 голосов
/ 25 января 2019

Использовать функцию String.split () было бы проще, чтобы получить то, что вы хотите.

Как вы упоминали, вход отделяется пробелом.Допустим, ввод - «Джордан 19», тогда вы можете использовать что-то вроде этого:

String [] data = full.split(" "); //split the input by a blank space
listNames.add(data[0]); //data[0] = Jordan
listNumbers.add(Integer.parseInt(data[1])); //data[1] = 19

Это должно работать, если все ваши входные данные представляют собой строку, за которой следует число

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...