【问题标题】:Use a While loop to add to array list使用 While 循环添加到数组列表
【发布时间】:2015-02-24 03:25:55
【问题描述】:

我有一个包含书籍的数组列表。我正在尝试做的(出于各种原因)是使用 While 循环继续将书籍添加到我的数组列表中,直到我告诉程序停止。为了让它停止,我使用扫描仪询问人类用户是否应该添加另一本书。如果用户说是,则该方法将重复,否则该方法将停止。

不幸的是,我被困在两个领域(目前)。首先,我不确定如何将决策插入到方法中,我试过了:

while(decision.equals("Yes"){addBooks(anyTitle,anyAuthor);},

然而,这似乎是错误的,因为它进入了一个循环(虽然我想要),但它会导致 2 个问题:A)即使我输入了其他内容,该方法也不会结束(除非我使用另一个扫描仪并包含break) 和 B) 相同的输入字段一遍又一遍地插入到数组列表中,而我没有机会输入新的字符串。

/**
 * Method to add a single book
 */
public void setOneBook(String anyTitle, String anyAuthor){
    bookList.add (new Book(anyTitle,anyAuthor));
}

/**
 * Method to add books to collection until the command to stop is given.
 */
public void addBooks(String anyTitle, String anyAuthor){
    bookList.add (new Book(anyTitle,anyAuthor));
    System.out.println("Would you like to add another book?");
    String decision = keybd.next();
}

我现在感觉很笨,所以请不要嘲笑自己。

在此过程中,我会弄乱我的代码,所以如果有任何变化(无论好坏),我都会更新我的帖子。

【问题讨论】:

  • addBooks() 中声明的decision 与控制循环的变量不同,因为在Java 中everything is passed by value
  • 您尝试做的事情听起来与我提议的 here 非常相似。

标签: java arraylist while-loop


【解决方案1】:

将询问更多信息的逻辑与更新列表的逻辑分开

String decision = "No";
do {
    System.out.println("Would you like to add another book?");
    decision = keybd.nextLine();
    if (decision.equals("Yes")) {
        // Get information about book
        String anyTitle = keybd.nextLine();
        String anyAuthor = keybd.nextLine();
        addBooks(anyTitle,anyAuthor);
    }
} while (decision.equals("Yes"));

您可以更进一步,创建一个addBook 方法来提示用户输入信息...

public void addBook() {
    String anyTitle = keybd.nextLine();
    String anyAuthor = keybd.nextLine();
    addBooks(anyTitle,anyAuthor);
}

那么你可以从while-loop 拨打addBook

do {
    System.out.println("Would you like to add another book?");
    String decision = keybd.nextLine();
    if (decision.equals("Yes")) {
        addBook();
    }
} while (decision.equals("Yes"));

进一步解耦你的代码,让你可以在任何时候调用addBook来提示用户关于这本书的信息并将它添加到列表中

【讨论】:

  • 关于您答案第一部分的三个问题:1)根据您的建议,无法找到决策变量。我尝试了一些东西,但它们没有帮助。 2)如果方法名称是: public void addBooks(String anyTitle, String anyAuthor) 那么它们甚至需要在编码中再次标识为字符串吗? 3)即使抛开其他两个问题,当我让它工作时,即使它显示程序正在运行,它也没有给我任何输入信息的地方。
  • 1- decision 应在 do 循环开始之前声明,已更正; 2-是的,因为方法的参数仅在方法中具有上下文/含义,对于其余代码,它们只是您传递信息的地方; 3- 那么允许用户输入图书信息的条件不满足,记住,equals是区分大小写的,所以你必须准确输入“是”
【解决方案2】:

如果我了解您的各种 sn-ps 代码,我强烈建议您考虑调用您的方法 setOneBook... 但我建议您更改方法的可见性(和名称)-

private void addOneBook(String anyTitle, String anyAuthor){
    bookList.add (new Book(anyTitle,anyAuthor));
}

这样你已经使用encapsulation 隐藏了添加书籍的方法。接下来,更改公共方法。您要添加多本书,所以不要传入标题或作者 -

public void addBooks() {
    do {
        String anyTitle = keybd.nextLine();
        String anyAuthor = keybd.nextLine();
        addOneBook(anyTitle, anyAuthor);
        System.out.println("Would you like to add another book?");
    } while (keybd.next().equalsIgnoreCase("yes"));
}

【讨论】:

    猜你喜欢
    • 2012-04-15
    • 2022-08-09
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 2015-06-24
    • 2013-02-28
    相关资源
    最近更新 更多