我正在尝试从Car的父类中获取一个参数并将其添加到我的数组(carsParked
),我该怎么做?
父类
public class Car
{
protected String regNo; //Car registration number
protected String owner; //Name of the owner
protected String carColor;
/** Creates a Car object
* @param rNo - registration number
* @param own - name of the owner
**/
public Car (String rNo, String own, String carColour)
{
regNo = rNo;
owner = own;
carColor = carColour;
}
/** @return The car registration number
**/
public String getRegNo()
{
return regNo;
}
/** @return A String representation of the car details
**/
public String getAsString()
{
return "Car: " + regNo + "\nColor: " + carColor;
}
public String getColor()
{
return carColor;
}
}
儿童班
public class Carpark extends Car
{
private String location; // Location of the Car Park
private int capacity; // Capacity of the Car Park - how many cars it can hold
private int carsIn; // Number of cars currently in the Car Park
private String[] carsParked;
/** Constructor for Carparks
* @param loc - the Location of the Carpark
* @param cap - the Capacity of the Carpark
*/
public Carpark (String locations, int room)
{
location = locations;
capacity = room;
}
/** Records entry of a car into the car park */
public void driveIn()
{
carsIn = carsIn + 1;
}
/** Records the departure of a car from the car park */
public void driveOut()
{
carsIn = carsIn - 1;
}
/** Returns a String representation of information about the carpark */
public String getAsString()
{
return location + "\nCapacity: " + capacity +
" Currently parked: " + carsIn +
"\n*************************\n";
}
}
最后问题方法
public String getCarsByColor(String carColour)
{
for (int num = 0; num < carsParked.length; num++) { if ( carColour.equals(carsParked[num]) ) { System.out.print (carsParked[num]);
}
}
return carColour;
}
到目前为止我已经这样了,如果在参数中放入“红色”,它会列出所有颜色为红色的汽车及其相应的信息,但似乎不起作用~_~。
答案 0 :(得分:7)
你似乎在这里有错误的关系:停车场不是汽车。我建议不要在这些类之间的任何一个方向上使用继承。 Carpark
应该只有一个阵列或汽车集合。
另请注意,参数carsIn
不是必需的 - 只需获取汽车数组的length
(或size()
,如果它是Collection
)。
编辑好的,忽略继承部分,似乎在调用driveIn
时添加汽车是有意义的,并在调用driveOut
时将其删除。< / p>
driveIn
可能应该以{{1}}作为参数,因此该方法可以访问您要存储的参数(我个人只会存储Car
引用,但很好)。由于我们将添加和删除这些参数,因此使用可以调整自身而不是数组的Car
会更容易,例如ArrayList
。例如:
List
private final List<String> carsRegNosParked = new ArrayList<String>();
public void driveIn(Car car) {
carsRegNosParked.add(car.getRegNo());
}
应该做什么不太清楚。可能需要删除特定的注册号:
driveOut
或者它可能只是不分青红皂白地移走一辆车,比如说第一辆车加了:
public void driveOut(String regNo) {
carsRegNosParked.remove(regNo);
}
请注意remove(Object)
和remove(int)
之间的区别。
答案 1 :(得分:0)
首先将carsParked
更改为列表。所以:
private String[] carsParked;
变为
private List<String> carsParked;
然后在构造函数中通过执行以下操作将其初始化为空列表: carsParked = new ArrayList();
然后在你的驾驶方法中,让它采取汽车参数并拉出你想要的参数:
public void driveIn(Car car) {
carsParked.add(car.getRegNo());
}
此外,您无需以这种方式跟踪汽车数量。因为你总是可以carsParked.size()
找出答案。
List<Car>
而不是字符串,然后将整个汽车转储到那里。当然,你现在可能只需要一件物品,但是谁知道在路上,也许你还需要别的东西。
修改强> 当然你可以用一个简单的数组来做到这一点。问题在于尺寸。假设您最初创建一个大小为5的数组,当您添加6项时,您需要创建一个新的更大的数组,复制原始数据,然后添加新项目。更多的工作。现在,如果您有一个停车场,并且它可以有X个点,那么您可以从头开始将阵列初始化为该大小。
public Carpark (String locations, int room){
location = locations;
capacity = room;
//this creates an array with the max number of spots
carsParked = new String[capacity];
//also good idea to init
carsIn = 0; //initial number of cars parked
}
然后在您的driveIn()
方法中:
public void driveIn(Car car) {
carsParked[carsIn] =car.getRegNo();
carsIn=carsIn+1;
}
现在driveOut()
public void driveOut(Car car) {
//loop through the array until we find the car
for (int i=0; i < carsParked.length; i=i+1){
if (car.getRegNo().equals(carsParked[i])){
//we found the car, so set the space null
carsParked[i] = null;
carsIn=carsIn-1;
//stop looping now
break;
}
}
}
看起来不错不是吗。好吧不,不是。现在driveIn
将不起作用,因为我们在整个地方都散布着零点。我们如何解决它:
public void driveIn(Car car) {
//loop through the array until we find a null spot,
//then park the car
for (int i=0; i < carsParked.length; i=i+1){
if (carsParked[i] == null){
//we found the car, so set the space null
carsParked[i] = car.getRegNo();
carsIn=carsIn+1;
//stop looping now
break;
}
}
}
它还可以进一步改进。我可能仍会将String[] carsParked
更改为Car[] carsParked
,以免丢弃信息。
我还会更改driveIn
和driveOut
方法以返回布尔值,以指示是否已成功停放或未停放汽车。
最终编辑:
好的,如果您想跟踪停放在停车场的汽车以及它们所在的位置,您需要了解每辆汽车的独特信息。在您的情况下,您可能只需要regNo
。因此,当您致电driveIn
或driveOut
时,您必须传递该信息,以便我们将其存储在数组中的相应索引(停车位)。否则所有你会知道的是一辆车停在某处,或者车停了。不是哪个斑点是开放的。
因此,简而言之,这两种方法中的参数Car car
包含唯一标识正在停放或正在离开的每辆车所需的信息。如果没有它,停车场实例将不知道当前停放的人或他们停放的地方。