2009-04-19 8 views
91

OO駐車場を設計する。どのようなクラスと機能がありますか。それは完全、空、またバレット駐車場のための場所を見つけることができると言う必要があります。ロットには、通常、障害者、コンパクトの3種類の駐車場があります。Amazon Interview質問:OO駐車場を設計する

ありがとうございます!ここで

+35

「これは書籍とは何が関係しているのですか?」と叫びましたか?嵐を吹き飛ばしますか? –

+0

私は別の状況に行った男によってそれを聞いた。私が教科書のほぼ4つの模様を適切に使用したとき、彼は「少なくとも多形性を知っています。私は来てくれたことに感謝し、私に知らせると言った。私は感動していませんでした。 –

+0

このメモリ管理に問題はありませんか? –

答えて

129

が回転ギアを取得するためのクイックスタートです...

ParkingLotは、クラスです。

ParkingSpaceはクラスです。

ParkingSpaceには入口があります。

入り口には、より具体的には入り口からの距離があります。

ParkingLotSignはクラスです。

ParkingLotにはParkingLotSignがあります。

ParkingLotには、限られた数のParkingSpacesがあります。

HandicappedParkingSpaceはParkingSpaceのサブクラスです。

RegularParkingSpaceは、ParkingSpaceのサブクラスです。

CompactParkingSpaceは、ParkingSpaceのサブクラスです。

ParkingLotは、ParkingSpacesの配列と、空いているParkingSpacesの配列を入り口からの距離の順に保持します。

ParkingLotSign)は "フル" を表示するように言われ、または "空"、または(.Fullを呼び出すことにより、 "ブランク/ノーマル/部分的に占有" することができ、.Empty()または.Normal()

パーカーれますクラス。

Parker can()。

Parker can Unpark()。

バレットは、ParkingSpaceを返すParkingLot.FindVacantSpaceNearestEntrance()を呼び出すことができるParkerのサブクラスです。

ParkerにはParkingSpaceがあります。

ParkerはParkingSpace.Take()とParkingSpace.Vacate()を呼び出すことができます。

ParkerはEntrance.Entering()とEntrance.Exiting()を呼び出し、ParkingSpaceはParkingLotを取得または削除したときにParkingLotが満杯かどうかを判断できるように通知します。新しく満杯か、新しく空であるか、または空でないか空でない場合は、ParkingLotSign.Full()またはParkingLotSign.Empty()またはParkingLotSign.Normal()を変更する必要があります。

HandicappedParkerはParkerのサブクラスで、CompactParkerはParkerのサブクラスで、RegularParkerはParkerのサブクラスです。

この解決策では、ParkerをCarに名前変更する必要があります(実際には過剰人である可能性があります)。

+19

車を忘れないでください。 – ojblass

+4

なぜParkingSpaceはクラスでなければならないのですか?私はそれのためのオブジェクトを作成する必要はありませんか?いつでも、駐車スペースは身体障害者、規則的な人、またはコンパクトのいずれかでなければなりません。 ParkingSpaceは、むしろインターフェースでなければなりません。 –

+8

おそらく私たちは駐車場に床を追加することができます。 – Barry

5

オブジェクト指向の駐車場では、車が駐車する方法を知っているので、乗務員は必要ありません。

ロットで使用可能な車を見つけることは困難です。最も一般的なモデルは、パブリックメンバ変数として公開されるすべての動く部分を持つか、窓やドアのない「完全にカプセル化された」自動車になります。私たちのOOの駐車場で

駐車スペースが私たちの多くに車のサイズと形状(スペースと車の間で「impedianceの不一致」)

ライセンスタグが一致しませんそれぞれの間にドットを持っています文字と数字。ハンディキャップ付き駐車場は "_"で始まるライセンスでのみ利用可能で、 "m_"で始まるライセンスは牽引されます。

4

駐車場が必要です。これは、コンストラクタで指定された多次元配列を型 "space"で保持します。駐車場は空白を埋める関数への呼び出しを介していくつのスペースが取られたかを追跡することができます.Spaceは、それがどのような種類の空間であるかを示す列挙型を保持できます。宇宙には方法もあります()。バレーパーキングのために、最初のスペースを見つけてそこに車を置いてください。あなたは、それが身体障害者、コンパクト、または普通の車であるかどうかを保持するスペースに入れるために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; 
} 
 
10

モデルが孤立して存在していません。駐車場に入る車のシミュレーション、自由空間に誘導する組み込みシステム、駐車場課金システム、または駐車場で通常使用される自動ゲート/チケット機のシミュレーション用に定義する構造はすべて異なります。

50
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, 
} 
+2

効率のためにビークル番号を持つリストの代わりにHashMapを使用 – user3716835

+4

あなたがビークルを解放すると、 'vacantParkingSpaces'はもうソートされません。 'findNearestVacant'が一番近い駐車スペースを返すようにソートする必要があります。 – laike9m

+0

なぜ関数は 'findNearestVacant'という名前になっていますか?その実装は、必ずしも"最も近い "ものではない空きスペースしか見つけられませんか?なぜ "findVacant"ではないのですか?クラスに格納されているいくつかの状態を使用して、「最も近い」スペースを返すと良いでしょう。多分、私たちは "空間"クラスの "入り口"と "出口"からの距離を保存することができるので、 "最も近い"空間も計算できます。あるいは、空間の座標だけですべての入り口と必要に応じて出口を計算することができます。 – Nawaz

関連する問題