【问题标题】:In Java, how do I use a loop to instantiate new objects, store them in an array, and then use them?在 Java 中,如何使用循环来实例化新对象,将它们存储在数组中,然后使用它们?
【发布时间】:2012-11-06 04:57:03
【问题描述】:

我有一个 CS 课程的介绍性作业。我有一个名为 Car 的类和一个单独的数据文件,用于以后的文件重定向。我要:

使用哨兵循环读取每辆汽车的品牌、年份和价格 对象,实例化该对象,并将其存储在数组 carArr[] 中。 例如,如果您创建一个分配给名为的变量的汽车对象 car1,你可以这样做: carArr[i] = car1 其中“i”是一个 int 计数器。 此外,计算数组的元素,因为它们存储在 int 中 变量,如“i”或 numCars

到目前为止,这是我的代码:

Scanner scan = new Scanner(System.in);
final int SIZE_ARR = 30;
Car [] carArr = new Car[SIZE_ARR];
int i = 0;
int numcars = 0;
String make = "";
int year = 0;
double price = 0.0;
final String SENT = "EndDatabase";

while (!scan.next().equals(SENT))
{
   make = scan.next();
   year = scan.nextInt();
   price = scan.nextDouble();
   Car car1 = new Car(make, year, price);
   carArr[i] = car1;
   i++;
   numCars++;
}

每次通过循环并读入不同名称的新数据时,如何创建一个新的 Car 对象? 他们需要有不同的名字吗? 照原样,我将制作一堆都命名为 car1 的对象。我最终将不得不打印出数据库,然后在一个新的 Car 对象中读取它们作为搜索键。然后该键将依次搜索 carArr 数组。 搜索是否会因为数组中的每个元素都填充了同名对象而感到困惑?

另外,当我搜索数组并将存储的对象与搜索对象进行比较时,我只需要这样做:

key.equals(carArr[i])

这会比较每个对象的实例变量吗?

在我的 Car 类中,我需要为我的 year、make 和 price 实例变量提供一个访问器方法。我需要在哪里使用这些? 它还指出我必须有一个“称为 setPrice 的变异器方法”和“一个 equals 方法”。 知道它们对我来说意味着什么吗? 很抱歉这个和多个问题的长度。我只是想保持领先于我的工作量,而我的老师没有回复电子邮件。谢谢!

**********编辑************************************ ********** 我想到了。谢谢!

【问题讨论】:

    标签: java arrays search object loops


    【解决方案1】:

    我的问题是如何在每次通过循环并读入不同名称的新数据时创建一个新的 Car 对象?

    对象没有名称。

    照原样,我只是制作一堆名为 car1 的对象。

    不,您将创建很多对象,仅此而已。在每次迭代中,您将为一个名为car1 的变量分配一个引用,但一个变量不是一个对象——甚至变量的值也不是一个对象,它是一个引用。

    完全摆脱car1 会更简单,直接将引用分配到数组中:

    carArr[i] = new Car(make, year, price);
    

    使用List<Car> 而不是数组会更好 - 这样您就不需要单独跟踪大小。我会把代码写成:

    Scanner scan = new Scanner(System.in);
    List<Car> cars = new ArrayList<Car>();
    
    while (!scan.next().equals("EndDatabase"))
    {
       String make = scan.next();
       int year = scan.nextInt();
       double price = scan.nextDouble();
       cars.add(new Car(make, year, price));
    }
    

    为了分配,你可能需要使用一个数组,但这很烦人......

    我也可能将 price 更改为 BigDecimal 而不是 double - 您不应该将二进制浮点类型用于货币值。

    (顺便说一句,您确定要丢弃在循环的每次迭代中读取的第一个值吗?您所做的只是检查它是否为EndDatabase - 如果不是,您基本上会丢失信息不管是什么...)

    【讨论】:

    • 我需要使用数组而不是数组列表。我还需要将price 设为双精度,因为我需要在我的 Car 类中使用方法来格式化它。我已经涵盖了。另外,“摆脱car1是什么意思
    • 另外,你是对的。我必须调整我的哨兵循环,这样如果不是哨兵,读入的第一个数据就不会被丢弃。我只是在循环之前先将其读入,然后在循环结束时再次读入
    • @GabrielleLee:对不起,我已经编辑了帖子——我的意思是写:carArr[i] = new Car(make, year, price);——这意味着你根本不需要car1 变量。仅仅因为您必须在 Car 中有一个方法来格式化价格并不意味着它必须是 double - 您也可以格式化 BigDecimal 值...
    猜你喜欢
    • 2016-07-13
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多