【问题标题】:I cant access the arraylist attribute of my object in java我无法在java中访问我的对象的arraylist属性
【发布时间】:2020-01-18 17:46:39
【问题描述】:

所以我有三个类,Employee、Event 和 Main。我的程序的目的是创建一个事件管理系统,用户可以在其中输入事件的名称以及参加该事件的员工的姓名和 ID。我有一个员工对象和一个事件对象。我的员工对象的属性是字符串名称和整数 ID。我的事件对象的属性是名称和参加该事件的 Employee 对象的 ArrayList。现在的问题是,在我的主要方法中,当我要求用户输入活动名称、活动中的员工人数,然后继续询问参加活动的员工的姓名和 ID 时,问题是在获得用户信息后,当我尝试显示正在参加活动的员工(例如他们的姓名)时,它只返回一个空数组列表。

我遇到的问题是代码末尾的一行打印出我用星号标识的特定活动的参与者。

这是主类的一些代码:

public class Main {

    public static void main (String[] args) {

        ArrayList<Event> events = new ArrayList<Event>();
        ArrayList<Employee> employees = new ArrayList<Employee>();

        Event event = null;
        Employee employee = null;       

        Scanner key = new Scanner (System.in);      
        String name, employeeName, id = "";
        int numOfEmployees, attendees = 0;

        System.out.print("How many events? "); 
        numOfEmployees = key.nextInt(); key.nextLine();
        for (int i = 0; i < numOfEmployees; i++) {
            System.out.println("===========================================");
            System.out.print("Enter the name of the event: "); 
            name = key.nextLine();          

            System.out.print("How many attendees? "); 
            attendees = key.nextInt(); key.nextLine();  

            for (int k = 0; k < attendees; k++) {       
                System.out.println("----------------------------------------");
                System.out.print("Enter the employee name: "); 
                employeeName = key.nextLine();

                System.out.print("Enter the employee IDs of the attendees: "); id = key.nextLine();

                int temp = Integer.parseInt(id);
                employee = new Employee(employeeName, temp);

                System.out.println(employee);
                employees.add(employee);

            }       

            System.out.println(employees);
            event = new Event(name, employees); 

            events.add(event);          
            //event = null; 
            employees.clear();          
        }

        System.out.println(events.get(1).getName());
        **System.out.println(events.get(1).getAttendees());**

        key.close();            
    }
}

如果你想要我的事件类和员工类的代码,我也可以给你,但这里只是两者的构造函数:

事件类的构造函数:

public Event (String name, ArrayList<Employee> employees) {
        this.name = name;
        this.events.add(name);
        this.attendees = employees;
    }

员工类的构造函数:

public Employee(String name, int ID) {
        this.name = name;
        this.ID = ID;
        this.employees.add(ID);
    }

【问题讨论】:

  • 错误是什么?
  • @arcadeblast77 没有错误,只是打印了一个空数组列表 [ ]
  • 您是否知道在 java 中,数组从索引 1 开始。您的 get(1) 有问题吗?应该是 get(0) 吗?
  • 如果你使用调试器,我相信你会发现ArrayList&lt;Employee&gt; 实际上是空的。粗略一瞥后,我并没有立即注意到为什么它是空的。我想在这里强调可读性的重要性,因为你的代码很难阅读(因此也很难调试)。像esate 这样的变量名称是完全无法解释的。尝试在您的命名策略中使用真实的单词。
  • @JosephLarson 是的,我知道,但是对于数组列表也是如此,我可以尝试一下

标签: java oop object for-loop arraylist


【解决方案1】:

尝试阅读:Is Java "pass-by-reference" or "pass-by-value"?

创建一个新的 ArrayList 并将其分配给 e 即可解决问题。

替换

e.clear();   

 e = new ArrayList<Employee>();

应该解决它。 (或者您也可以在 Event 构造函数中使用克隆。)

所有事件都指向同一个ArrayList,所以

e.clear()

清除所有活动的参与者。

【讨论】:

    猜你喜欢
    • 2020-11-21
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多