2011-12-04 73 views
0

与对象数组时,我在Java对象数组的工作,它只是我很难理解他们,我想这只是因为我没有用他们尚未..在Java

基本上我'试图做的是有一个选项菜单出现..当用户按下“1”(在主应用程序类中)时,它将它们带到另一个类(addVehicle()),其中Vehicle对象作为参数传入。 (这一切工作正常)

在这个类我限制车辆最大4的顶部:

Vehicle[] vehicles = new Vehicle[4]; 

然后在这里的是,增加了车辆的方法:

public void addVehicle(Vehicle vehicle[]) throws FileNotFoundException 
{ 
    reader = new Scanner(file); 
    if(canAddVehicle(vehicles[vehicles.length - 1])) 
    { 
     vehicle[vehicles.length - 1] = new Vehicle(); 
     vehicle[vehicles.length - 1].readRecord(reader); 

     System.out.println("Vehicle Added!"); 
    } 
    else 
    { 
     System.out.println("You can not add more than 4 vehicles."); 
    } 
} 

我想将它存储在数组中的下一个点(如果仍有一个点打开)以及与该车辆相关的所有信息

我在做什么这是正确的方式?该车辆对象是否正确存储到阵列中?我应该在第一堂课中询问有关车辆的信息吗?

回答

2

我认为问题在于你不了解vehicles.length代表什么。

如果你说:

Vehicle[] vehicles = new Vehicle[4]; 

然后vehicles.length总是4。这是阵列的长度;它是固定的(你不能调整数组的大小),并且你没有为任何元素分配任何东西并不重要。创建阵列时,您将拥有四个元素,每个元素都包含null

要做你正在尝试使用数组,你有几个选项。

  • 跟踪的最后一个索引,你分配一个Vehicle来,通过阵列要插入并找到第一null的指数每次开始0
  • 迭代。 (请注意,这是做这个非常低效的方法)

较容易的路径是使用Java的Collections是动态的,当你添加的东西尺寸增加的一个。例如,一个ArrayList

+0

谢谢,是的我虽然车辆。长度表示有多少对象当前在阵列中 – MJ93

1

没有。由于您已指定了数组的长度,因此长度将始终返回4,因此您将始终插入数组的末尾。理想情况下,如果你想这样做,你需要保留一个插入元素数量的计数器(并检查空间!)。另外,我不知道你的vehicle参数在做什么,因为它似乎没有被使用。

一个更好办法做到这一点是使用一个ArrayList,当然,如果你想学习如何使用对象数组,不会帮助你。

0

如果我理解正确,您正在尝试使用vehicles.length来计算已添加项目的数量。这是错误的。vehicles.length总是返回4.这是一个方法来检查下一个可用的项目(假设你仍然要使用数组)

private <T> int nextAvailableIndex(T[] array) { 
    for (int i = 0; i < array.length; i++) { 
     if (array[i] == null) { 
      return i; 
     } 
    } 

    return -1; 
} 

您可以使用ArrayList作为前建议。但是,请记住,ArrayList可以无限增长。您的代码应该如下所示:

List<Vehicle> l = new ArrayList<Vehicle>(4); // Initial/expected Capacity! 

if(l.size() < 4) { 
    // do stuff 
} 
0

找到我的解决方案!感谢您的帮助

 for(int i = 0; i < vehicles.length || !found; i++) 
      { 
       if(vehicles[i] == null) 
       { 
        Scanner reader = new Scanner(file); 
        vehicle[i] = new Vehicle(); 
        vehicle[i].readRecord(reader); 
        found = true; 
        reader.close(); 
       } 

      }