【问题标题】:Using Array Lists and Creating Objects使用数组列表和创建对象
【发布时间】:2013-04-06 22:57:49
【问题描述】:

我很难理解将对象添加到数组列表的工作原理以及相关的语法。

查看 Java 中的数组列表,“如何编程”第 9 版。它没有明确说明如何将对象从测试类添加到数组列表中。我只是不明白它们是如何传递/添加的。

在我的例子中,我使用 Phonebook.java 类来定义默认和非默认构造函数,并使用 Test 类将这些对象添加到数组列表中。

我的问题是,在测试类中添加这些对象的过程是什么,以及如何使用数组列表来处理或初始化 PhoneBook 类中的这些对象?

到目前为止我的代码如下。

电话簿.java ->

公开课PhoneBookTest {

public static void main (String [] args)
{

    Scanner input = new Scanner (System.in);

    ArrayList < PhoneBook > directory = new ArrayList <PhoneBook>(5);

    System.out.println ("Welcome to your Phone Book");
    System.out.println ("Add Entries to the list");
    System.out.println ();

    PhoneBook x;
    String num = null;
    String name = null;

    for (int i = 0; i < 5 ; i++)
    {

        System.out.println ("Enter Name: ");
        name = input.nextLine();
        System.out.println();

        System.out.println ("Enter Number: ");
        num = input.nextLine();
        System.out.println();

        PhoneBook newEntry = new PhoneBook (name, num);
        directory.add (newEntry);
    }


}

【问题讨论】:

  • 您是遇到错误还是只是想了解数组列表的基本工作原理?
  • 我建议您查看this official tutorial from Oracle,了解有关列表的更多信息。
  • 您还没有编写任何仅将 int/Integer 作为其参数的构造函数(您在 main 的第 2 行的构造函数中传递了 5)。您是否尝试创建 PhoneBook 对象数组?另外,根据您打印的“将条目添加到列表”的事实,您应该调用 setter 方法而不是 getter。在 for 循环条件检查中,您应该检查 ArrayList name.size()。
  • 好吧,我遇到了几个错误。我知道我的代码很垃圾。我基本上不明白如何以这种方式使用数组列表。从另一个类调用对象,并将输入设置到对象的每个部分并将其添加到数组中。如果您只想预定义所有值并将其全部声明在主类中,这很容易,但它变得棘手,并且需要(我认为)比我还没有掌握的更多经验/知识。不幸的是,我拥有的 java 书,以及我正在学习的课程并没有强迫我们编写测试类......所以现在当我不得不这样做时,我迷失了。 :(
  • Avik,是的,我正在尝试创建一个电话簿对象数组。

标签: java arraylist pass-by-reference


【解决方案1】:

将对象添加到任何列表(ArrayList 只是列表的一种实现)使用add 方法。在您的示例中,将每个条目添加到 ArrayList 的末尾,PhoneBookTest 看起来像这样:

class PhoneBookTest
{
  public static void main( String[] args )
  {
    List<PhoneBook> phoneBooks = new ArrayList<PhoneBook>( 5 );
    Scanner input = new Scanner (System.in);

    System.out.println ("Welcome to your Phone Book");
    System.out.println ("Add Entries to the list");
    System.out.println ();

    for (int i = 1; i < = phoneBooks.size(); i++)
    {
        System.out.println ("Enter Name: ");
        String name = input.nextLine();
        System.out.println();
        System.out.println ("Enter Number: ");
        String number = input.nextLine();
        System.out.println();

        PhoneBook newEntry = new PhoneBook( name, number );
        phoneBooks.add( newEntry );
    }
  }
}

【讨论】:

  • 我们还没有被介绍给“列表”。这只是使用数组列表。所以我现在试图理解这一点。不过我很欣赏你的评论。
  • 没问题。您可以在我放置List 的任何地方使用ArrayList。我只是习惯于引用接口而不是类。你最终会到达那里!
  • 有趣...程序运行了,但它从不要求我输入。我猜两件事中的一件事......我是否应该在每次代码运行时创建一个新对象,然后在获得用户输入后使用“添加”函数将这些元素添加到数组的该部分?这就是我在这里想念的吗?
  • new ArrayList&lt;PhoneBook&gt;( 5 ) 不足以使 ArrayList 有 5 个条目。您必须声明一个大小变量,并在构造列表和循环输入时使用它。
  • 我明白你的意思。如果我按原样运行它,它似乎只会永远运行,除非我按 ctrl-z 并且它会出错。我刚刚将计数器调整为只运行 5 次。我在哪里放置的值 (5) 只是初始分配?
【解决方案2】:

在你的循环中你是参考

Phonebook.getName() in an effort to set it.

您的代码需要访问电话簿的实例,而不是静态引用它。 您还需要循环列表,而不是电话簿类。

   for (int i = 1; i < = directory.size(); i++)
   {
   ((Phonebook) directory.get(i)).setName("setting name to this text!");

你也可以像这样迭代列表:

   for(Phonebook myphonebook : directory)

我认为您应该阅读 Java 类和迭代的基础知识。

试试这个: Lessons on Java

【讨论】:

  • 无意冒犯,但向我介绍类和迭代的定义并不能帮助我理解它们在类中的实现,如上所述。我的大部分困惑在于它们是如何被调用/引用的。他们根本不是显示这一点的文档。大多数 java 文档都太抽象了,以我有限的知识无法理解。上面提供的 java 教程静态地声明了单个对象(一次 1 个)。而上面的程序正在尝试动态创建对象。我真的认为这应该是java教程文档的一部分......
  • 我认为您可能正在尝试真正学习 Java。我的错。
  • 我并不是要忘恩负义,感谢您的意见。
  • 然而,java 教程和定义并没有回答我的基本问题。
猜你喜欢
  • 2015-02-25
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 2013-08-01
  • 2023-02-08
  • 1970-01-01
  • 2020-03-14
相关资源
最近更新 更多