1. 程式人生 > >黑馬程式設計師11-7k面試題交通燈

黑馬程式設計師11-7k面試題交通燈

---------------------- android培訓java培訓、期待與您交流! ----------------------

1,交通燈管理系統的需求是什麼?

非同步隨機產生按照各個路線行駛的車輛

比如:

由南向北行駛的車輛視為直行車輛

由南向西行駛的車輛視為左行車輛

。。。

訊號燈忽略黃燈,只考慮紅燈和綠燈

左轉車輛控制訊號燈,右轉車輛不受訊號燈控制

具體的訊號燈控制邏輯和現實生活中的交通燈控制邏輯相同,不考慮特殊情況下的控制邏輯。

每輛車通過路口的時間為1秒。

隨機生成車輛時間間隔和紅綠燈交換時間間隔自定,可以手動設定。

不需要使用GUI,只考慮控制邏輯。

通過畫圖得出來的行駛路線圖

2,交通燈的面向物件分析中有幾個物件?

路 不需要將汽車單獨設計成一個物件,只需要把它設計為一個字串即可

紅綠燈 紅綠燈要變化,需要使用列舉

紅綠燈控制系統 

3,如何對交通燈進行面向物件的分析與設計?

每條路上會出現多輛車,路線上要隨即增加車,子啊紅綠燈期間還要每秒減少一輛車。

設計一個Road類來表示路線,每個Road物件代表一條;路線,總共有12條路線,即系統中總共要產生12Road例項物件。

每條路線上隨即增加新的車輛。

每條路線上隨機增加新的車輛,增加到一個集合中保持。

每條路線每隔一秒都會檢查控制本路線的燈是否為綠,是則將本路線儲存車的集合中的第一輛車移除,即表示車穿過了路口。

每條路線每隔一秒都會檢查控制本路線的燈是否為綠,一個燈由綠變紅時,應該將下一個方向的燈變綠。

設計一個Lamp類來表示交通燈,每個交通燈都維護一個狀態:亮和不亮,亮表示綠,不亮表示紅。

每個交通燈由自己變亮和變黑的方法,並且能返回自己的亮黑狀態。

4,如何設計Road物件?

/*

需求:設計一個Road類,每條路線上隨機增加新的車輛,增加到一個集合中儲存。

      每條路線每隔一秒都會檢查控制本路線的燈是否為綠,是則將本路線儲存車的集合中的第一輛車移除,即表示車穿過了路口。

思路:1,採用列舉,將十二個方向設計成十二個類的例項物件。

      2,設計一個ArrayList集合,用字串代表車。

*/

public class Road

{

    private List<String> vechicles=new ArrayList<String>();

private String name=null;

public Road(String name)

{

this.name=name;

ExecutorService pool=Executors.newSingleThreadExecutor();

pool.execute(new Runnable()

{

  public void run()

  {

  for(int i=1;1<1000;i++)

{

  try

  {

Thread.sleep((new Random().nextInt(10)+1)*1000);

  }

  catch (InterruptedException e)

  {

  e.printStackTrace();

  }

vechicles.add(Road.this.name+"_"+i);

     }

  }

});

}

ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);

    timer.scheduleAtFixedRate(new Runnable()

{

     public void run()

{

      if(vechicles.size()>0)

 {

       boolean lighted = Lamp.valueOf(Road.this.name).isLighted();

       if(lighted)

{

        System.out.println(vechicles.remove(0) + " is traversing !");

       }

      }

     }

    }

    TimeUnit.SECONDS);

}

}

5,如何設計代表燈的Lamp類的程式碼?

由於只有一套控制系統,所以設計成單例設計模式。

每個Lamp元素代表一個方向上的燈,總共有12個方向,所有總共有12Lamp元素。

public enum Lamp {

/*每個列舉元素各表示一個方向的控制燈*/

S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),

/*下面元素表示與上面的元素的相反方向的燈,它們的“相反方向燈”和“下一個燈”應忽略不計!*/

N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),

/*由南向東和由西向北等右拐彎的燈不受紅綠燈的控制,所以,可以假想它們總是綠燈*/

S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);

private Lamp(String opposite,String next,boolean lighted){

this.opposite = opposite;

this.next = next;

this.lighted = lighted;

}

/*當前燈是否為綠*/

private boolean lighted;

/*與當前燈同時為綠的對應方向*/

private String opposite;

/*當前燈變紅時下一個變綠的燈*/

private String next;

public boolean isLighted(){

return lighted;

}

/**

 * 某個燈變綠時,它對應方向的燈也要變綠

 */

public void light(){

this.lighted = true;

if(opposite != null){

Lamp.valueOf(opposite).light();

}

System.out.println(name() + " lamp is green,下面總共應該有6個方向能看到汽車穿過!");

}

/**

 * 某個燈變紅時,對應方向的燈也要變紅,並且下一個方向的燈要變綠

 * @return 下一個要變綠的燈

 */

public Lamp blackOut(){

this.lighted = false;

if(opposite != null){

Lamp.valueOf(opposite).blackOut();

}

Lamp nextLamp= null;

if(next != null){

nextLamp = Lamp.valueOf(next);

System.out.println("綠燈從" + name() + "-------->切換為" + next);

nextLamp.light();

}

return nextLamp;

}

}

---------------------- android培訓java培訓、期待與您交流! ----------------------