【问题标题】:How to load an ArrayList with instances of an Object I created如何使用我创建的对象的实例加载 ArrayList
【发布时间】:2013-08-04 08:30:00
【问题描述】:

注意:我将代码编辑为我认为人们试图告诉我的方式,但它仍然没有给我想要的输出。现在我的输出是“examples.search.Person@55acc1c2”,但是我多次输入新的名字和姓氏。至少它可以通过代码而不崩溃lol

我正在学习如何使用 ArrayLists,并且需要加载一个包含我创建的 Object 实例的 Array 列表。我知道如何使用数组执行此操作,但对于此任务,我需要使用 ArrayList 执行此操作。这是我需要做的一个例子。

// my "main" class
package examples.search;

import java.util.ArrayList;

import dmit104.Util;

public class MyPeople {

    public static void main(String[] args) {

        ArrayList<Person> people = new ArrayList<Person>();
        Person tempPerson = new Person();
        String firstName;
        String lastName;
        char choice = 'y';
        int count = 1;

        // fill my ArrayList
        do {
            people.add(tempPerson);
            // I have a Util class that has a prompt method in it
            firstName = Util.prompt("Enter First Name: ");
            lastName = Util.prompt("Enter Last Name: ");

            tempPerson.setFirstName(firstName);
            tempPerson.setLastName(lastName);

            count++;

            choice = Util.prompt(
                    "Enter another person? [y or n]: ")
                    .toLowerCase().charAt(0);

        } while (choice == 'y');

        // display my list of people
        for(int i = 0; i < people.size(); i += 1) {
            System.out.print(people.get(i));
        }

    }

}

// my Person class which I am trying to build from
public class Person {

    // instance variables
    private String firstName;
    private String lastName;

    // default constructor
    public Person() {
    }

    public String getFirstName(){
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

我已经尝试了很多方法,但无论如何我的 ArrayList 都没有填满。就像我提到的那样,我可以用数组做到这一点,或者即使我有一个加载的构造函数方法,但我没有。在我的实际任务中,我应该使用 set 方法来完成。

我到处找,找不到解决问题的方法,因为星期五我的教练不在。

非常感谢您

狮子座

【问题讨论】:

  • 您的“默认构造函数”根本不是构造函数。类的构造函数必须与类同名。在这种情况下,构造函数必须命名为 Person()。顺便说一句,除非您非常需要可变类,否则您应该始终尝试将值对象实例化为不可变类型的实例。在您的情况下,lastname 和 firstname 应声明为 final 并在 Person() 构造函数中设置为它们的初始值。
  • 你说你知道如何为数组做这件事,好吧,这并没有什么不同,在创建ArrayList`people之后,你没有对象,你必须创建它们并添加它们到列表中。
  • Oh ya scottb,它在我的课堂上说 Contact 应该是 Person。当我将代码粘贴到大声笑中时,我忘记了更改它。我实际上正在制作一个联系人管理器,我需要这样做,以便用户可以添加和删除联系人并能够更改它们(以防有人更改电子邮件、电话号码等)
  • 谢谢 madth3,这就是问题所在,我不知道如何添加它们。我可以在数组列表中添加一个 int 或一个 stringn,但是添加我自己创建的新对象是我遇到问题的地方

标签: java oop arraylist


【解决方案1】:

您必须创建一个Person,然后将add 发送到ArrayList。

for (int i = 0; i < count; i++) {
    Person person = new Person();

    person.setFirstName("Foo");
    person.setLastName("Bar");

    people.add(person); 
}

【讨论】:

  • 感谢 adashr。所以这将适用于我正在尝试做的事情?我只是在“Person person = new Person();”行之间添加我的输入和“person.setFirstName(firstName);”听起来对吗?
【解决方案2】:

它崩溃了,因为您的行 people.get(i).setFirstName(firstName); 首先尝试索引 i 处的内容,但您尚未设置任何内容。

要么先将 people[i] 设置为空 Person,要么使用 firstName 和 lastName 创建一个 person,然后使用 people.add(person); 将其添加到 people

【讨论】:

    【解决方案3】:

    您有一个ArrayList&lt;Person&gt;,但仅此一项就定义了一个潜在的Person 实例列表。但到目前为止,每个列表条目都是null。 get(i) 返回null,下面的null.setFirstName(..) 导致 NullPointerException。

    所以您需要创建应该进入列表的Person 的实例:

    firstName = Util.prompt("Enter First Name: ");
    Person p = new Person(); //create the instance
    people.add(p); //add the instance to the list
    p.setFirstName("..."); //set any values
    

    【讨论】:

    • 感谢 f1sh。所以要向我的 ArrayList 添加多个实例,我只需在循环中添加上面的代码?也许是一个 for 循环?
    • 我相信它会抛出IndexOutOfBoundsException
    • @leoJaxx 是的,在循环中使用它,因为您想创建一定数量的 Person 实例并将其存储在列表中。 for 循环是完美的。
    • @AmirPashazadeh 为什么会这样? ArrayList 的默认大小为 10。在第一次运行期间,调用 list.get(0),它不会抛出 IndexOutOfBoundsException(因为 0 在允许的范围内)但返回 null。
    • @f1sh,我对其进行了编辑以尝试您的解释和其他解释。我用我的输入把它放在 do while 循环中。我在文章的开头留下了评论。感谢您的所有帮助,我很感激
    【解决方案4】:

    现在您将 Person 对象存储到 ArrayList 中并打印该对象。 要在打印 Person 对象时打印名字和姓氏,您必须重写 toString 方法。 在您的 Person 类中添加以下代码

    public String toString(){
        return String.format("[Personn: firstName:%s ,lastName: %s]", firstName,lastName);
    }
    

    【讨论】:

    • 这是我的课所缺少的。我只是将正文更改为仅返回我的变量(名字 + 姓氏)谢谢。但是我选择了另一个答案,因为他们给了我你现在在这里看到的代码。我的原始代码是一团糟。谢谢你,我很感激
    【解决方案5】:

    至于第二个问题,你必须重写Person 类中的toString() 方法。你得到的输出,例如examples.search.Person@55acc1c2 是Object 类的默认toString() 方法,定义为class@hashCode

    【讨论】:

      猜你喜欢
      • 2018-08-15
      • 2016-04-16
      • 1970-01-01
      • 1970-01-01
      • 2022-08-08
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 2020-10-10
      相关资源
      最近更新 更多