【问题标题】:How to loop through ArrayList of objects and make it print everything?如何循环遍历对象的 ArrayList 并使其打印所有内容?
【发布时间】:2026-02-17 21:15:02
【问题描述】:

几天前我问了this 的问题,现在我有一个更具体的问题,因为我在我的程序上做了更多工作并添加了一些东西。基本上我从一个空的 ArrayList 开始,它应该保存通过控制台添加的生日。这部分我下来了+它打印了我添加的生日。但是如果我想添加另一个,它会打印我再次添加的第一个?我怎样才能让它打印出我到目前为止添加的所有生日?我将展示我目前拥有的代码

生日课

public class Birthday {
    private String bdayKid;
    private int age;
    private boolean gift;
    
    public Birthday(String bdayKid, int age, boolean gift) {
        this.bdayKid = bdayKid;
        this.age = age;
        this.gift = gift;
    }
    
    //overridden toString() method
    public String toString() { 
        return this.bdayKid + " turns " + this.age + "! They are" + 
            (this.gift ? "" : "not ") + " getting a gift.";
    }
}

主类

public class MainClass{
   public static void main(String []args) {
      ArrayList<Birthday> bdays = getBirthdays();
      printBirthdays(bdays);
   }

   //This method will return a list of birthdays
   public ArrayList<Birthday> getBirthdays() { 
      ArrayList<Birthday> bdays = new ArrayList<Birthday>();
      Scanner scan = new Scanner(System.in);
      
      //create a birthday
      Birthday bday = new Birthday(scan.nextLine(), scan.nextInt(), scan.nextBoolean());
      //add the birthday to arraylist of birthdays
      bdays.add(bday);

      
      return bdays;
   }

   //This method will print a list of birthdays
   public void printBirthdays(ArrayList<Birthday> bdays) {    
      //iterate through each birthday and print out the result 
      for (Birthday bday : bdays) {
         System.out.println(bday);
      }
   }
}

在一个冗长的 switch 语句中,我添加了这个选项:

System.out.println("Do you want to add another birthday?");
                    boolean anotherOne = scan.nextBoolean();
                    if (anotherOne == true) {
                        getBirthdays();
                        printBirthdays(bdays);
                    }

我是否需要在我的 for-each 循环中添加一个 if 语句?任何帮助表示赞赏!

【问题讨论】:

  • ehm ...您的代码已经在做您要求它做的事情,您还需要什么?如果您想要更多元素,只需在 while 循环中检查您的 anotherOne,然后将 anotherOne 的值重置为该循环的最后一条语句
  • "我怎样才能让它打印出我到目前为止添加的所有生日" getBirthdays() 中,您创建一个新的局部变量 ArrayList&lt;Birthday&gt; bdays,然后添加到该局部变量变量并返回它。因为每次调用该方法时,您都会创建一个新的本地 ArrayList,这些列表永远不会包含超过一个生日。
  • @OHGODSPIDERS 哦,不......我该如何解决这个问题?
  • 不要总是创建新的本地对象。相反,为什么不将 List 设为类的字段并在构造函数中对其进行初始化。
  • @Stultuske 你的解释是有道理的,但是当我查看我的代码时我冻结了 T_T 你能大致解释一下代码中的样子吗?对不起,我是新手

标签: java loops arraylist


【解决方案1】:

您在理解 Java 方面存在严重问题。首先,你需要了解一个概念,变量的作用域。

如果在函数内创建变量,则变量的作用域仅在函数内。

您有不同的ArrayList&lt;Birthday&gt; 实例,标识符为bdays。您在void main 函数中定义的一个实例,以及其他实例在您每次调用getBirthdays() 方法时创建。在 switch 语句中,当你调用getBirthdays() 时,会形成一个新的ArrayList&lt;Birthday&gt; 并由函数返回,而你原来的ArrayList&lt;Birthday&gt; bdays 保持不变。当您调用 printBirthdays(bdays) 时,它会将参数作为您在 main 方法的第一行创建的数组,而不是 getBirthdays() 方法返回的新 ArrayList。因此,它不会打印新的Brithday。因此,您可以将代码更改如下:

主类

public class MainClass{
   public static void main(String []args) {
      // Instantiate your one and only bdays array
      ArrayList<Birthday> bdays = new ArrayList<Birthday>();
      getBirthdays(bdays);
      printBirthdays(bdays);
   }

   //This method will return a list of birthdays
   public void getBirthdays(ArrayList<Birthday> bdays) { 
      Scanner scan = new Scanner(System.in);
      
      //create a birthday
      Birthday bday = new Birthday(scan.nextLine(), scan.nextInt(), scan.nextBoolean());
      //add the birthday to arraylist of birthdays
      bdays.add(bday);

      // Good practice to close a scanner
      scan.close();
   }

   //This method will print a list of birthdays
   public void printBirthdays(ArrayList<Birthday> bdays) {    
      //iterate through each birthday and print out the result 
      for (Birthday bday : bdays) {
         System.out.println(bday);
      }
   }
}

和,

System.out.println("Do you want to add another birthday?");
                boolean anotherOne = scan.nextBoolean();
                if (anotherOne == true) {
                    getBirthdays(bdays);
                    printBirthdays(bdays);
                }

请注意,Java 将对象作为引用传递,因此如果您将 **bdays** 传递给 getBirthdays(bdays),那么此函数内对 bdays 所做的所有更改也将发生在 main 方法中的原始 bdays 中。更准确地说,它们在您的记忆中是相同的ArrayList,而maingetBirthdays(bdays) 两种不同方法中的变量getBirthdays(bdays) 只是引用您在函数开始时创建的相同ArrayList&lt;Birthday&gt; 的不同标识符并作为对getBirthdays 方法的引用传递。查看其他有关在 java 中通过引用传递变量的相关教程。

【讨论】:

  • 非常感谢您为我打破这个概念!我知道在使用每个概念之前我应该​​完全理解它,但我认为用一个小项目尝试一些东西会更好。所以,是的,非常感谢,它正在工作! :]
  • 你做对了,我们就是这样学习的。
【解决方案2】:

IMO 最好的方法是将 getBirthdays() 拆分为 printBirthdays() 和 addBirthday()。这是代码,您可以使用自己的逻辑来循环输入:

import java.util.ArrayList;
import java.util.Scanner;

public class MainClass {
    static ArrayList<Birthday> bdays = new ArrayList<>();
    public static void main(String []args) {

        while(true) {
            //Use this method every time you need to add new BDay
            addBirthday();
            //Use this method to print all BDays in ArrayList
            printBirthdays();
        }
    }
    public static void addBirthday(){
        Scanner scan = new Scanner(System.in);
        Birthday bday = new Birthday(scan.nextLine(), scan.nextInt(), scan.nextBoolean());
        bdays.add(bday);
    }
    public static void printBirthdays(){
        for(Birthday b: bdays){
            System.out.println(b);
        }
    }
}

【讨论】:

  • 显而易见的问题是您正在创建一个无限循环。为什么要在每个生日后打印数组?添加最后一个后,只需打印列表的内容即可。
  • @Stultuske 请再次阅读问题并回答。他需要在输入的那一刻打印列表中的所有 BDays。我已经向他展示了如何做到这一点。并要求他使用 HIS OWN 逻辑循环输入,而不是我为测试提供的无限循环。
  • 也许你应该重新阅读它。他表示,在添加之前添加的生日打印是他试图解决的问题
  • @Stultuske 在评论之前运行他的代码。或谷歌“变量的范围”。他的问题是,每当他希望它打印列表时,它只打印第一个添加的生日。检查他的 main() 方法的第一行,然后检查 getBirthdays() 方法找出原因
【解决方案3】:

Birthday 类中添加字段:

private boolean printed = false;

然后在你的打印功能上:

 //This method will print a list of birthdays
   public void printBirthdays(ArrayList<Birthday> bdays) {    
      //iterate through each birthday and print out the result 
      for (Birthday bday : bdays) {
         if(!bday.isPrinted())
         {
            System.out.println(bday);
            bday.setPrinted(true);
         }
      }
   }

【讨论】:

  • 为什么会有人这样做?结果将是“我将在每次执行循环时迭代每个元素,并且只处理最后一个”,所以为什么不直接在 Sysstepm.out.println(bdays.get(bdays.size ()-1); 或者,更好的是,将 printBirthdays 移出循环