熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

java面試題之一:交通燈管理系統

2022-06-13   來源: JSP教程 

背景介紹 軟件開發公司現在都越來越精明和狡猾了他們把日後工作中要解決的問題並且是他們自己都很難解決的問題拿出來讓面試求職者去搞 不管面試求職者的水平怎樣他們都說誰能搞定誰就來上班這樣至少求職者在進公司之前就已經為公司做了貢獻 軟件公司這招夠狠夠高!
題目來源 前一陣子的某一天中午有一個學員打電話給我說他去國內某大型的軟件外包公司應聘了要求的薪水是k該公司給了他一道面試題就是要做一個模擬的交通燈管理系統 並說公司外包了一個法國交通系統的項目現在就是在替做這個交通系統的項目組招人這個交通燈管理系統就是招聘進來的人上班後要開發的項目模型如果他在家三天內能夠做出來他就可以入職上班了並且他要求的薪水則不是任何問題還可以更高一些這個同學做了兩天感到很困難於是打電話向我求助我讓他把題目發到我的郵箱晚上又有一個學員給我打電話說是去某公司面試了該公司讓他做一個交通燈管理系統 三天內做出來就可以直接去上班我馬上告訴他已經有一個同學先他一步來找我了我只能滿足他們兩人中的一人否則他們就會出現答案雷同最後對他們兩人都造成不利影響 後來又有幾個學員拿著不同公司的面試題找我題目如出一轍都是公司要求把日後的項目拿回家做什麼時候做好就什麼時候上班看來以後靠背我們的面試寶典來突擊找工作的方式越來越困難了軟件公司把他們項目中的復雜問題拿出來讓面試者做如果面試者正好是傳智播客的學員他們必將求助於我們我們這批老師也就順理成章地成為這些公司免費使用的超級勞工
這些軟件公司精心策劃的項目題確實都有很強的技術性和實用價值在此感謝奉獻了這些題目的學員在征得這些學員們的同意後我將逐步公布和講解這些項目面試題下面是某公司的交通燈管理系統的需求
交通燈管理系統

模擬實現十字路口的交通燈管理系統邏輯具體需求如下

異步隨機生成按照各個路線行駛的車輛

例如
由南向而來去往北向的車輛&#; 直行車輛
由西向而來去往南向的車輛&#; 右轉車輛
由東向而來去往南向的車輛&#; 左轉車輛

信號燈忽略黃燈只考慮紅燈和綠燈

應考慮左轉車輛控制信號燈右轉車輛不受信號燈控制

具體信號燈控制邏輯與現實生活中普通交通燈控制邏輯相同不考慮特殊情況下的控制邏輯

南北向車輛與東西向車輛交替放行同方向等待車輛應先放行直行車輛而後放行左轉車輛

每輛車通過路口時間為秒(提示可通過線程Sleep的方式模擬)

隨機生成車輛時間間隔以及紅綠燈交換時間間隔自定可以設置

不要求實現GUI只考慮系統邏輯實現可通過Log方式展現程序運行結果

解題思路

首先為了較好地理解和分析問題切不可空想一定要畫圖!畫圖非常有助於理解和分析問題你還有比畫圖更好的辦法嗎?

我畫的交通燈路線圖如下

接著進行面向對象的分析和設計

(一)每條路線上都會出現多輛車路線上要隨機增加新的車在燈綠期間還要每秒鐘減少一輛車
設計一個Road類來表示路線每個Road對象代表一條路線總共有條路線即系統中總共要產生個Road實例對象
每條路線上隨機增加新的車輛增加到一個集合中保存
每條路線每隔一秒都會檢查控制本路線的燈是否為綠是則將本路線保存車的集合中的第一輛車移除即表示車穿過了路口
(二)每條路線每隔一秒都會檢查控制本路線的燈是否為綠一個燈由綠變紅時應該將下一個方向的燈變綠
設計一個Lamp類來表示一個交通燈每個交通燈都維護一個狀態亮(綠)或不亮(紅)每個交通燈要有變亮和變黑的方法並且能返回自己的亮黑狀態
總共有條路線所以系統中總共要產生個交通燈右拐彎的路線本來不受燈的控制但是為了讓程序采用統一的處理方式故假設出有四個右拐彎的燈只是這些燈為常亮狀態即永遠不變黑
除了右拐彎方向的其他條路線的燈它們是兩兩成對的可以歸為所以在編程處理時只要從這組中各取出一個燈對這個燈依次輪詢變亮與這個燈方向對應的燈則隨之一同變化因此Lamp類中要有一個變量來記住自己相反方向的燈在一個Lamp對象的變亮和變黑方法中將對應方向的燈也變亮和變黑每個燈變黑時都伴隨者下一個燈的變亮Lamp類中還用一個變量來記住自己的下一個燈
無論在程序的什麼地方去獲得某個方向的燈時每次獲得的都是同一個實例對象所以Lamp類改用枚舉來做顯然具有很大的方便性永遠都只有代表個方向的燈的實例對象
設計一個LampController類它定時讓當前的綠燈變紅

類的編碼實現

(一)Road類
每個Road對象都有一個name成員變量來代表方向有一個vehicles成員變量來代表方向上的車輛集合
在Road對象的構造方法中啟動一個線程每隔一個隨機的時間向vehicles集合中增加一輛車(用一個路線名_id形式的字符串進行表示)
在Road對象的構造方法中啟動一個定時器每隔一秒檢查該方向上的燈是否為綠是則打印車輛集合和將集合中的第一輛車移除掉
源碼如下
package orgitinterviewtraffic;import javautilArrayList;import javautilList;import javautilRandom;import javautilconcurrentExecutors;import javautilconcurrentTimeUnit;/** * 每個Road對象代表一條路線總共有條路線即系統中總共要產生個Road實例對象 * 每條路線上隨機增加新的車輛增加到一個集合中保存 * 每條路線每隔一秒都會檢查控制本路線的燈是否為綠是則將本路線保存車的集合中的第一輛車移除即表示車穿過了路口 * @author IBM * */public class Road {private String direction;private List vehicles = new ArrayList();public Road(String dir){thisdirection = dir;//模擬車輛不斷上路的過程ExecutorsnewSingleThreadExecutor()execute(new Runnable(){public void run(){for(int i=;i<;i++){vehiclesadd(direction + &#;:&#; + i);//Systemoutprintln(&#;add &#; + direction + &#;:&#; + i);try {Threadsleep(new Random()nextInt());} catch (InterruptedException e) {eprintStackTrace();}}}});//每隔一秒檢查對應的燈是否為綠是則放行一輛車ExecutorsnewScheduledThreadPool()scheduleAtFixedRate(new Runnable(){public void run(){Lamp lamp = LampvalueOf(direction);if(lampisLighted()){if(vehiclessize() >)Systemoutprintln(vehiclesremove() + &#; is traversing &#;);}}} TimeUnitSECONDS);}}
(二)Lamp類
系統中有個方向上的燈在程序的其他地方要根據燈的名稱就可以獲得對應的燈的實例對象綜合這些因素將Lamp類用java中的枚舉形式定義更為簡單
每個Lamp對象中的亮黑狀態用lighted變量表示選用SNSWEWEN這四個方向上的Lamp對象依次輪詢變亮Lamp對象中還要有一個oppositeLampName變量來表示它們相反方向的燈再用一個nextLampName變量來表示此燈變亮後的下一個變亮的燈這三個變量用構造方法的形式進行賦值因為枚舉元素必須在定義之後引用所以無法再構造方法中彼此相互引用所以相反方向和下一個方向的燈用字符串形式表示
增加讓Lamp變亮和變黑的方法light和blackOut對於SNSWEWEN這四個方向上的Lamp對象這兩個方法內部要讓相反方向的燈隨之變亮和變黑blackOut方法還要讓下一個燈變亮
除了SNSWEWEN這四個方向上的Lamp對象之前其他方向上的Lamp對象的nextLampName和oppositeLampName屬性設置為null即可並且SNSWEWEN這四個方向上的Lamp對象的nextLampName和oppositeLampName屬性必須設置為null以便防止light和blackOut進入死循環
源碼如下
package orgitinterviewtraffic;/** * 每個Lamp元素代表一個方向上的燈總共有個方向所有總共有個Lamp元素 * 有如下一些方向上的燈每兩個形成一組一組等同時變綠或變紅所以 * 程序代碼只需要控制每組燈中的一個燈即可 * snns * swne * ewwe * eswn * senw * enws * 上面最後兩行的燈是虛擬的由於從南向東和從西向北以及它們的對應方向不受紅綠燈的控制 * 所以可以假想它們總是綠燈 * @author IBM * *//**/public enum Lamp{/*每個枚舉元素各表示燈控制的一個方向*/SN(&#;NS&#;false&#;SW&#;)SW(&#;NE&#;false&#;EW&#;)EW(&#;WE&#;false&#;ES&#;)ES(&#;WN&#;false&#;SN&#;)/*由南向東和由西向北不受紅綠燈的控制所以可以假想它們總是綠燈*/SE(&#;NW&#;true&#;SE&#;)EN(&#;WS&#;true&#;EN&#;)/*下面元素表示與上面的元素的相反方向的燈其中所有的參數值不重要應忽略不計!*/NS(nullfalsenull)NE(nullfalsenull)WE(nullfalsenull)WN(nullfalsenull)NW(nulltruenull)WS(nulltruenull);/*燈是否為綠*/private boolean lighted;/*與燈同時為綠的對應方向*/private String opposite;/*燈變紅時下一個變綠的燈*/private String next;private Lamp(String oppositeboolean lightedString next){thisopposite = opposite;thislighted = lighted;thisnext = next;}/** * 燈變綠時它對應方向的燈也要變綠 */public void light(){thislighted = true;if(opposite!=null){Lamp lampOpposite = LampvalueOf(opposite);lampOppositelight();}Systemoutprintln(name() + &#; lamp is green下面總共應該有個方向能看到汽車穿過!&#;);}public boolean isLighted(){return lighted;}/** * 燈變紅時對應方向的燈也要變紅並且下一個方向的燈要變綠 * @return 下一個要變綠的燈 */public Lamp blackOut(){thislighted = false;if(opposite!=null){Lamp lampOpposite = LampvalueOf(opposite);lampOppositeblackOut();}Lamp nextLamp = null;if(next != null){nextLamp = LampvalueOf(next);nextLamplight();Systemoutprintln(&#;綠燈從&#; + name() + &#;&#;&#;&#;>切換為&#; + next);}return nextLamp;}}
(三)LampController類
整個系統中只能有一套交通燈控制系統所以LampController類最好是設計成單例
LampController構造方法中要設定第一個為綠的燈
LampController對象的start方法中將當前燈變綠然後啟動一個定時器每隔將當前燈變紅和將下一個燈變綠
源碼如下
package orgitinterviewtraffic;import javautilconcurrentExecutors;import javautilconcurrentTimeUnit;public class LampController {private static LampController instance = new LampController();public static LampController getInstance(){return instance;}private Lamp currentLamp = null;private LampController(){//剛開始讓由南向北的燈變綠;currentLamp = LampSN;}public void start(){currentLamplight();/*每隔秒將當前綠燈變為紅燈並讓下一個方向的燈變綠*/ExecutorsnewScheduledThreadPool()scheduleAtFixedRate(new Runnable(){public void run(){currentLamp = currentLampblackOut();}} TimeUnitSECONDS);}}
(四)MainClass類
用for循環創建出代表條路線的對象
接著再獲得LampController對象並調用其start方法
源碼如下
package orgitinterviewtraffic;public class MainClass {/** * @param args */public static void main(String[] args) {/*產生個方向的路線*/String [] directions = {&#;SN&#;&#;NS&#;&#;SW&#;&#;NE&#;&#;EW&#;&#;WE&#;&#;ES&#;&#;WN&#;&#;SW&#;&#;NW&#;&#;EN&#;&#;WS&#;};for(int i=;i<directionslength;i++){new Road(directions);}/*產生整個交通燈系統*/LampControllergetInstance()start();}}


From:http://tw.wingwit.com/Article/program/Java/JSP/201405/30947.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.