如何将多个单词存储为 ArrayList 值

How To Store Multiple Words As An ArrayList Value

 public void addItem() {
        System.out.println("Please type the item to add to the To-Do List");
        System.out.println();
        String newItem = inputread.next();
        toDoList.add(newItem);
        System.out.println("Your item has been added! Type any key and press Enter to continue");
        String discardMe = inputread.next();
        menu();
    }

这是我的代码,我只是在学习 Java 并尝试制作一个 "To-Do List" 类型的小程序。就目前而言,我一次只能添加一个词。例如,如果我键入 "Pick Up Milk",则 arrayList 仅存储 "Pick"。

我尝试使用上面的 inputread.nextLine(),但后来我得到了 "InputMismatchException"。有什么建议吗?我确定这很简单。

已编辑以包括整个 class,根据请求:

public class ToDo {
    Scanner inputread = new Scanner(System.in);
    ArrayList<String> toDoList = new ArrayList<String>();


    public void menu() {
        clearConsole();
        System.out.println("Welcome to the To-Do program.");
        System.out.println();
        System.out.println();
        System.out.println("Please select an option from the following menu, using the number.:");
        System.out.println("1- View To-Do List");
        System.out.println("2- Add Item To List");
        System.out.println("3- Remove Item From List");
        int userinput = inputread.nextInt();

        switch (userinput) {
            case 1:
                clearConsole();
                displayList();
                System.out.println();
                System.out.println("This is your list. Type any key and press Enter to continue");
                String discardMe = inputread.next();
                menu();
                break;
            case 2:
                clearConsole();
                addItem();
                break;
            case 3:
                clearConsole();
                deleteItem();
                break;

        }
    }

    public void clearConsole() {
        for (int i = 0; i < 25; i++) {
            System.out.println();
        }
    }


    public void addItem() {
        System.out.println("Please type the item to add to the To-Do List");
        System.out.println();
        String newItem = inputread.nextLine();
        toDoList.add(newItem);
        System.out.println("Your item has been added! Type any key and press Enter to continue");
        String discardMe = inputread.next();
        menu();
    }

    public void displayList() {
        if (toDoList.isEmpty()) {
            System.out.println("For [REDACTED]'s sake, add an activity.");
        } else {
            for (String listItem: toDoList) {
                System.out.println(listItem);
            }
        }

    }

    public void deleteItem() {
        System.out.println("Please choose the number of the line you want to delete:");
        displayList();
        int userinput = inputread.nextInt();
        int listPos = userinput - 1;
        toDoList.remove(listPos);
        System.out.println("That item has been deleted. Type any key and press Enter to continue.");
        String discardMe = inputread.next();
        menu();
    }
}

Stultuskes 想法的示例:

    public void addItem() {
        System.out.println("Please type the item to add to the To-Do List");
        System.out.println();
        try (Scanner in = new Scanner(System.in)) {
            while (in.hasNext()) {
                String newItem = in.next();
                toDoList.add(newItem);
                System.out
                    .println("Your item has been added! Type any key and press Enter to continue");
            }
        }
        System.out.println(toDoList);
}

我建议使用 BufferedReader 而不是 Scanner class。 Scanner 的问题是它会在空格和新行之间寻找标记,所以当你添加类似 Go to the store 的内容时,空格之间的每个标记都会被拾取,你最终会使用 go to the store,而不是 1 个大令牌。您可以通过使用 BufferedReader 声明它来获取输入:

public static BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));

然后,在您的 addItem() 方法中,在 while(true) 循环中,您从 reader 读取输入,然后检查它是否为空。如果它是空的,那么你打破循环并退出函数,否则添加一个项目到你的列表。

    System.out.println("Please type the item to add to the To-Do List"); // Output
    while (true) { // Continue adding items until user just hits enter
        String newItem = buf.readLine(); // read user input
        if (newItem == null || newItem.isEmpty()) { // check if the user entered anything, or just hit enter
            break; // If they didn't enter anything, then break the loop and drop out of the function
        }
        toDoList.add(newItem); // if they did enter something, add it to your to-do list

    }

例如,为了对此进行测试,我使用了一个主要方法:

public static BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));

public static void main(String[] args) throws IOException {
    List<String> toDoList = new ArrayList<String>();
    System.out.println("Please type the item to add to the To-Do List");
    while (true) {
        String newItem = buf.readLine();
        if (newItem == null || newItem.isEmpty()) {
            break;
        }
        toDoList.add(newItem);

    }
    System.out.println("Your item has been added! Type any key and press Enter to continue");

    for (String s : toDoList) {
        System.out.println(s);
    }
}

然后,当提示输入时,我输入了:

Please type the item to add to the To-Do List
Go to the grocery store and get milk
Stop by the gym and pay membership fees
Pick up flowers for the wife

对于输出我得到:

Your item has been added! Type any key and press Enter to continue
Go to the grocery store and get milk
Stop by the gym and pay membership fees
Pick up flowers for the wife

这段代码有几个问题。

让我们首先解决您的输入问题。

在菜单中,您看到了一个数字。当您使用 scanner.next()scanner.nextInt() 等时,它会读取以下项目,但不包括任何白色 space 或换行符。所以白色 space 或换行符保留在缓冲区中等待读取。

现在,当您转到 addItem() 并使用 nextLine() 时,它只会显示白色 space 或换行符。如果它只是一个换行符(你按下了 Return),那么你会得到一个空字符串,你可能不想将它添加到列表中。如果您使用 next() 它将跳过该换行符但是...它只会读取一个单词。

因此您需要在菜单中的 nextInt() 之后添加一个 nextLine()。读取整数后,您将清除缓冲区直至并包括换行符。

然后,在 addItem() 方法中,您将能够再次使用 nextLine(),因为它现在将从一个新的新行开始 - 并且它将读取它的下一行完整。

另外,discardMe部分必须和nextLine()在一起,不能和next()在一起,否则不会清除行尾进行下一步操作


你的另一个问题是你没有问过的。您目前所做的基本上是进入菜单,然后进入操作,然后进入菜单,然后进入操作。您不断调用越来越多的函数,而您从来没有 return,或者更确切地说,当您显示列表时,您从所有函数中调用 return。

及时,这可能会导致堆栈溢出。

这样做的正确方法不是从操作方法内部调用 menu(),而是在显示菜单的 menu() 方法中有一个循环,调用适当的操作方法,当它 returns(清除它在堆栈上的 space)时,循环回到菜单等。这使您的堆栈保持美观和平坦。

当然,您的菜单上应该有一个 "Quit" 选项。

public void addItem() {
    System.out.println("Please type the item to add to the To-Do List");
    //The skip gets over the leftover newline character
    inputread.skip("\n");
    String newItem = inputread.nextLine();
    toDoList.add(newItem);
    System.out.println("Your item has been added! Type any key and press Enter to continue");
    String discardMe = inputread.next();
    menu();
}

放入 skip 为我修复了它。我要感谢你们的回答。