亚马逊采访问题:设计一个OO停车场[关闭]


114

设计一个OO停车场。它将具有哪些类和功能。应该说满了,空了,还可以找到代客泊车的地方。该停车场有3种不同类型的停车位:常规,残疾人和紧凑型。

谢谢!


39
您跳起来大喊“这与书籍有什么关系”吗?冲出来?
JP Alioto

我被另一个人问到了。当我恰当地使用一本近乎为“四人帮”模式的教科书时,他说:“至少您知道多态性。” 然后,我感谢我的到来,并告诉他们让我知道。我没被打动。
David Thornley,2009年

这不是内存管理问题吗?
Sanjeev Kumar Dangi

1
当被问到这个问题时,您实际上是必须在CollabEdit上写出类和函数还是只需要谈论它们?
committedandroider

看看它。github.com/shanshaji/parking-lot,希望对您有所帮助
Shan

Answers:


159

这是使齿轮转动的快速入门...

ParkingLot是一类。

ParkingSpace是一类。

ParkingSpace有一个入口。

入口有一个位置,或更确切地说是与入口的距离。

ParkingLotSign是一个类。

ParkingLot有一个ParkingLotSign。

ParkingLot具有有限数量的ParkingSpaces。

HandicappedParkingSpace是ParkingSpace的子类。

RegularParkingSpace是ParkingSpace的子类。

CompactParkingSpace是ParkingSpace的子类。

ParkingLot保留了一系列的ParkingSpaces,以及一个单独的闲置的ParkingSpaces,这些空间与距其入口的距离顺序相同。

通过调用.Full()、. Empty()或.Normal(),可以告诉ParkingLotSign显示“满”,“空”或“空白/正常/部分占用”。

帕克是一类。

派克可以Park()。

派克可以Unpark()。

Valet是Parker的子类,可以调用ParkingLot.FindVacantSpaceNearestEntrance(),该函数返回ParkingSpace。

帕克有一个ParkingSpace。

派克可以调用ParkingSpace.Take()和ParkingSpace.Vacate()。

派克会调用Entrance.Entering()和Entrance.Exiting(),ParkingSpace会在有人拿走或腾空它时通知ParkingLot,以便ParkingLot可以确定它是否已满。如果它是新装满或新装满或新装满或装满的,则应更改ParkingLotSign.Full()或ParkingLotSign.Empty()或ParkingLotSign.Normal()。

HandicappedParker可以是Parker的子类,CompactParker可以是Parker的子类,RegularParker可以是Parker的子类。(实际上可能是过大了。)

在此解决方案中,Parker有可能应重命名为Car。


32
请不要忘记开车。
ojblass

5
为什么ParkingSpace必须是一类?我看不到需要为此创建对象吗?任何时候,任何停车位都必须是残疾人,普通或紧凑型。ParkingSpace应该是一个接口。
name_masked 2010年

11
也许我们可以对地面停车场加..
巴里

13
为什么存在ParkingLotSign类?属性(例如bool isFull;)行不通吗?
Chinmay Nerurkar 2012年

3
为什么要增加停车位?为什么不只有一个isHandicapped字段和一个isCompact字段到停车位?
committedandroider

67
public class ParkingLot 
{
    Vector<ParkingSpace> vacantParkingSpaces = null;
    Vector<ParkingSpace> fullParkingSpaces = null;

    int parkingSpaceCount = 0;

    boolean isFull;
    boolean isEmpty;

    ParkingSpace findNearestVacant(ParkingType type)
    {
        Iterator<ParkingSpace> itr = vacantParkingSpaces.iterator();

        while(itr.hasNext())
        {
            ParkingSpace parkingSpace = itr.next();

            if(parkingSpace.parkingType == type)
            {
                return parkingSpace;
            }
        }
        return null;
    }

    void parkVehicle(ParkingType type, Vehicle vehicle)
    {
        if(!isFull())
        {
            ParkingSpace parkingSpace = findNearestVacant(type);

            if(parkingSpace != null)
            {
                parkingSpace.vehicle = vehicle;
                parkingSpace.isVacant = false;

                vacantParkingSpaces.remove(parkingSpace);
                fullParkingSpaces.add(parkingSpace);

                if(fullParkingSpaces.size() == parkingSpaceCount)
                    isFull = true;

                isEmpty = false;
            }
        }
    }

    void releaseVehicle(Vehicle vehicle)
    {
        if(!isEmpty())
        {
            Iterator<ParkingSpace> itr = fullParkingSpaces.iterator();

            while(itr.hasNext())
            {
                ParkingSpace parkingSpace = itr.next();

                if(parkingSpace.vehicle.equals(vehicle))
                {
                    fullParkingSpaces.remove(parkingSpace);
                    vacantParkingSpaces.add(parkingSpace);

                    parkingSpace.isVacant = true;
                    parkingSpace.vehicle = null;

                    if(vacantParkingSpaces.size() == parkingSpaceCount)
                        isEmpty = true;

                    isFull = false;
                }
            }
        }
    }

    boolean isFull()
    {
        return isFull;
    }

    boolean isEmpty()
    {
        return isEmpty;
    }
}

public class ParkingSpace 
{
    boolean isVacant;
    Vehicle vehicle;
    ParkingType parkingType;
    int distance;
}

public class Vehicle 
{
    int num;
}

public enum ParkingType
{
    REGULAR,
    HANDICAPPED,
    COMPACT,
    MAX_PARKING_TYPE,
}

6
使用HashMap代替以车辆编号为效率的列表
sanath_p 2014年

5
释放车辆后,vacantParkingSpaces不再进行排序。您必须对其进行排序,以便findNearestVacant返回最近的停车位。
laike9m 2015年

1
为什么将函数命名为findNearestVacant,而其实现只能找到一个空闲空间,而不一定是“最近的”空间?为什么不使用“ findVacant”?尽管使用存储在类中的某些状态返回“最近”空间会很好。也许,我们可以将“入口”和“出口”之间的距离存储在“空间”类中,以便也可以计算“最近”,或者我们可以简单地计算空间的坐标,从而使所有入口和出口之间的距离出口可以根据需要进行计算。
Nawaz

1
同样,该函数parkVehicle应返回一个布尔值,指示车辆是否已停放。
Nawaz

没有空检查。将抛出NPE
HITESH

10

模型不是孤立存在的。您为模拟进入停车场的汽车而定义的结构,可将您引导至自由空间的嵌入式系统,停车场计费系统或停车场中常见的自动门/票务机定义的结构都不同。


6

在面向对象的停车场中,不需要乘务员,因为汽车会“知道如何停车”。

在很多地方很难找到可用的汽车。最常见的模型要么将其所有运动部件公开为公共成员变量,要么将其是没有窗户或门的“完全封装”汽车。

我们的OO停车场中的停车位将与汽车的大小和形状不匹配(这些空间与汽车之间的“障碍物不匹配”)

我们批次上的许可证标签在每个字母和数字之间都有一个点。残疾人专用停车位仅适用于以“ _”开头的驾照,并拖曳以“ m_”开头的驾照。


5

您将需要一个停车场,该停车场可容纳类型为“空间”的多维数组(在构造函数中指定)。停车场可以通过调用填充和清空空间的函数来跟踪占用了多少空间.Space可以容纳枚举类型,以告知其空间类型。太空也有一个taken()方法。对于代客泊车,只需找到第一个开放的空间,然后将汽车放在那里。您还需要将Car对象放入空间中,该对象可以容纳残疾人,紧凑型或常规车辆。


class ParkingLot
{
    Space[][] spaces;

    ParkingLot(wide, long); // constructor

    FindOpenSpace(TypeOfCar); // find first open space where type matches
}

enum TypeOfSpace = {compact, handicapped, regular };
enum TypeOfCar = {compact, handicapped, regular };

class Space
{
    TypeOfSpace type;
    bool empty;
    // gets and sets here
    // make sure car type
}

class car
{
    TypeOfCar type;
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.