【问题标题】:How to manually populate array with objects?如何用对象手动填充数组?
【发布时间】:2013-11-01 10:41:26
【问题描述】:

我是 Java 新手,在理解如何手动使用对象填充数组时遇到问题。我不想手动执行此操作的原因是因为我需要创建 40 个对象,其中 20 个对象转到 arrayOne,其他 20 个对象转到 arrayTwo。此外,每个对象都有一个需要设置的唯一参数,例如“Texas”或“Canada”。

我通常会像这样创建一个数组:

long[] arrayOne;
arrayOne = new long[20];

比填充它,让我们通过循环或手动说数字。但是现在我正在处理对象并且正在努力弄清楚,我尝试在 StackOverflow 上查找答案,但无法准确理解那里发生了什么。

如果有帮助,这是我的对象的构造函数

    // Plane Constructor
    public Plane (int i, String dest, String airl, String airc, double t) {

            planeID = i;
            destination = dest;
            airline = airl;
            aircraft = airc;
            time = t;

    }// END Plane Constructor

【问题讨论】:

    标签: java arrays object


    【解决方案1】:

    我建议使用ArrayList 而不是数组,因为列表可以增长但数组是固定大小的。但是,要回答您的问题:

    Plane[] arrayOne = new Plane[20];
    Plane[] arrayTwo = new Plane[20];
    
    arrayOne[0] = new Plane(1001, "Timbuktu");
    arrayOne[1] = new Plane(2930, "Siberia");
    // etc.
    
    arrayTwo[0] = new Plane(2019, "France");
    arrayTwo[1] = new Plane(1222, "Italy");
    // etc.
    

    如果您使用ArrayList,它将是:

    List<Plane> arrayOne = new ArrayList<Plane>();
    planes.add(new Plane(1001, "Timbuktu"));
    planes.add(new Plane(2930, "Siberia"));
    // etc.
    

    或者,如果你真的很喜欢:

    List<Plane> planes = new ArrayList<Plane>() {{
        add(new Plane(1001, "Timbuktu"));
        add(new Plane(2930, "Siberia"));
    }};
    

    在所有情况下,您都可以按如下方式迭代内容:

    for (Plane plane : arrayOne) {
        System.out.println(plane.getDestination());
    }
    

    【讨论】:

      【解决方案2】:
      Plane[] array = new Plane[10];
      array[0] = new Plane(/*specify your parameters here*/)
      

      查看 Java 语言规范的 chapter 10

      【讨论】:

      • 这是一个非常丑陋的解决方案。如果您不知道您将拥有/从某个地方检索多少对象怎么办?动态数组应该更有效率。
      • @Sajmom,OP 说他们是 Java 新手。可能还没有学过数据结构。你需要知道如何使用数组。所以让 OP 在他们跑之前先走。此外,OP 明确表示他们有 40 个对象,每个数组 20 个。
      • @Sajmon 如果我看到“如何在 Java 中使用数组?”这个问题,我将展示 Java 中的数组示例。我不明白人们对新手说“不不不,那是错误的方式,使用 ArrayList,将其分配给 List 接口,这样您以后可以更改实现,并考虑一些您可以使用的模式在这里使用”。 OP 要求向他解释 Java 的基础知识,我照做了。如果他需要了解 ArrayList,他会问另一个问题或在其他地方学习。
      • 好吧,伙计们。但是您在这里建议最好的方法,或者至少提到还有另一种更有效的方法,我认为使用静态或动态数组几乎相同,也许动态更简单和舒适。但好吧,我刚才提到了 - 没有冒犯。
      • 两者都可以;回答问题并分享您的智慧。
      【解决方案3】:

      您必须声明一个对象数组(在本例中为 Plane),就像声明 long - Plane[] arrayOne = new Plane[20]; 的数组一样。然后您可以以相同的方式使用索引访问元素。如果您真的必须手动填充它,您应该执行以下操作:

      arrayOne[0] = new Plane(1, "foo", "bar", "baz", 1.0);
      arrayOne[1] = new Plane(2, "fooo", "baar", "baaz", 2.0);
      

      Object[] 数组和long[] 的用法只有两点不同——数组的类型以及在某些时候您必须使用构造函数来创建对象。不过,您可以使用以前创建的对象。

      【讨论】:

        【解决方案4】:

        U首先创建Plane数组:

        Plane[] planes = new Plane[20];
        

        然后每个对象:

        planes[0] = new Plane(...);
        

        ...

        【讨论】:

          【解决方案5】:

          如果array 的元素不一定是Plane 的实例,您可以使用通用interface

          例如:

          封装测试;

          public class Main {
              public static void main(String[] args) {
                  Flyer[] flyers = new Flyer[] { new Plane(), new Bird() };
                      for (Flyer f: flyers) {
                          // you can only access method "fly" here, because it's the only
                          // method defined in your interface, but nothing
                          // stops you from adding more methods, as long as you implement 
                          // them in the (non-abstract) classes
                          f.fly();
                      }
              }
          }
          
          class Plane implements Flyer {
              // TODO id, destination, airline, etc. getters/setters
              @Override
              public void fly() {
                  System.out.println("Weeee I'm flying!");
              }
          }
          
          class Bird implements Flyer {
              // TODO whatever properties / getters / setters
              @Override
              public void fly() {
                  System.out.println("Chirp chirp");
              }
          }
          
          interface Flyer {
              void fly();
          }
          

          输出:

          Weeee I'm flying!
          Chirp chirp
          

          【讨论】:

          • 真的很感谢你把它更进一步,但我认为这样的东西还不是我的水平,我不想先学习基础知识,但肯定会研究后者!
          • @Ilja 当然!我可能有点误解了你的问题:)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-31
          • 2013-03-10
          • 1970-01-01
          • 2019-01-15
          • 1970-01-01
          • 2019-11-27
          • 1970-01-01
          相关资源
          最近更新 更多