黑馬程式設計師面試題一(交通燈管理系統)
--------- android培訓、java培訓、期待與您交流!---------
城市交通問題是本世紀以來,工業已開發國家一直為之困擾的問題。進入80年代以來,我國城市的經濟貿易和社會活動日益繁忙,城市交通發生了前所未有的迅速增長,傳統的道路交通設施已經不能適應現代社會的需要。當前,我國城市特別是大城市的交通問題極其嚴重,如果不能得到有效解決和根本治理,必將對我國經濟的持續、快速、健康發展構成嚴重威脅。
一.專案需求:
非同步隨機生成按照各個路線行駛的車輛。
例如:
由南向而來去往北向的車輛 ---- 直行車輛
由西向而來去往南向的車輛 ---- 右轉車輛
由東向而來去往南向的車輛 ---- 左轉車輛
。。。
訊號燈忽略黃燈,只考慮紅燈和綠燈。
應考慮左轉車輛控制訊號燈,右轉車輛不受訊號燈控制。
具體訊號燈控制邏輯與現實生活中普通交通燈控制邏輯相同,不考慮特殊情況下的控制邏輯。
注:南北向車輛與東西向車輛交替放行,同方向等待車輛應先放行直行車輛而後放行左轉車輛。
每輛車通過路口時間為1秒(提示:可通過執行緒Sleep的方式模擬)。
隨機生成車輛時間間隔以及紅綠燈交換時間間隔自定,可以設定。
二.開發前分析:
1. 一個方向到其他方向有3條線路,4個方向共12條線路,為了統一程式設計模型,
可以假設每條路都有一個紅綠燈對其進行控制, 右轉向的4個路口的控制燈可以假設為常亮綠燈狀態。
2.為了思路清晰,先思考一個方向的路線問題。
3.初步設想所擁有的物件:紅綠燈,紅綠燈的控制系統,(汽車),路線。
4.汽車要看所線上路上的紅綠燈,並且判斷前方是否有車。路中儲存著汽車的集合,顯然路上就應該有增加車輛 和減少車輛的方法了。
我們要捕捉路上減少一輛車的過程,所以,這個車並不需要單獨設計成為一個物件。用一個字串表示就行了。
三.開發過程
類的編寫:
Road類的編寫:
每個Road物件都有一個name成員變數來代表方向,有一個vehicles成員變數來代表方向上的車輛集合。
在Road物件的構造方法中啟動一個執行緒每隔一個隨機的時間向vehicles集合中增加一輛車(用一個“路線名_id”形 式的字串進行表示)。
在Road物件的構造方法中啟動一個定時器,每隔一秒檢查該方向上的燈是否為綠,是則列印車輛集合和將集合 中的第一輛車移除掉。
程式碼如下:
- <span style="font-size:18px;">
- 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() {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- for (int i = 1; i < 1000; i++) {
- try {
- // 隨機獲取1-10秒的數,讓車輛不定時的往裡增加
- Thread.sleep((new Random().nextInt(10) + 1) * 1000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- vechicles.add(Road.this.name + "_" + i);
- }
- }
- });
- //建立一個執行緒,按時間安排執行任務的功能
- ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
- timer.scheduleAtFixedRate(new Runnable() {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- if (vechicles.size() > 0) // 判斷現在是否有車輛
- {
- boolean lighted = Lamp.valueOf(Road.this.name).isLight();
- //System.out.println(Road.this.name+">>>>>>>>>>>>>"+lighted);
- if (lighted) {
- System.out
- .println(vechicles.remove(0) + " ...is traverse");
- }
- }
- }
- }, 1, 1, TimeUnit.SECONDS);
- }
- }</span>
Lamp燈的編寫:
Lamp類來表示一個交通燈,12個,使用列舉。
系統中有12個方向上的燈,在程式的其他地方要根據燈的名稱就可以獲得對應
的燈的例項物件,綜合這些因素,將Lamp類用java5中的列舉形式定義更為簡單。
每個Lamp物件中的亮黑狀態用lighted變數表示,選用S2N、S2W、E2W、E2N這四
個方向上的Lamp物件依次輪詢變亮,Lamp物件中還要有一個oppositeLampName變
量來表示它們相反方向的燈,再用一個nextLampName變數來表示此燈變亮後的下
一個變亮的燈。這三個變數用構造方法的形式進行賦值,因為列舉元素必須在定
義之後引用,所以無法再構造方法中彼此相互引用,所以,相反方向和下一個方
向的燈用字串形式表示。
增加讓Lamp變亮和變黑的方法:light和blackOut,對於S2N、S2W、E2W、E2N這
四個方向上的Lamp物件,這兩個方法內部要讓相反方向的燈隨之變亮和變黑,
blackOut方法還要讓下一個燈變亮。
除了S2N、S2W、E2W、E2N這四個方向上的Lamp物件之外,其他方向上的Lamp物件
的nextLampName和oppositeLampName屬性設定為null即可,並且S2N、S2W、E2W、
E2N這四個方向上的Lamp物件的nextLampName和oppositeLampName屬性必須設定為
null,以便防止light和blackOut進入死迴圈。
程式碼如下:
- <span style="font-size:18px;">
- 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() {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- for (int i = 1; i < 1000; i++) {
- try {
- // 隨機獲取1-10秒的數,讓車輛不定時的往裡增加
- Thread.sleep((new Random().nextInt(10) + 1) * 1000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- vechicles.add(Road.this.name + "_" + i);
- }
- }
- });
- //建立一個執行緒,按時間安排執行任務的功能
- ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
- timer.scheduleAtFixedRate(new Runnable() {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- if (vechicles.size() > 0) // 判斷現在是否有車輛
- {
- boolean lighted = Lamp.valueOf(Road.this.name).isLight();
- //System.out.println(Road.this.name+">>>>>>>>>>>>>"+lighted);
- if (lighted) {
- System.out
- .println(vechicles.remove(0) + " ...is traverse");
- }
- }
- }
- }, 1, 1, TimeUnit.SECONDS);
- }
- }</span>
LampController類的編寫:
整個系統中只能有一套交通燈控制系統,所以,LampController類最好是設計成單例。
LampController構造方法中要設定第一個為綠的燈。
LampController物件的start方法中將當前燈變綠,然後啟動一個定時器,每隔10秒將當前燈變紅和將下一個燈變 綠。
- <span style="font-size:18px;"> 程式碼如下:
- public class LampController {
- private Lamp controlLamp;
- public LampController() {
- controlLamp = Lamp.S2N; //先初始化一條線路上的燈
- controlLamp.light();
- // TODO Auto-generated constructor stub
- ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
- timer.scheduleWithFixedDelay(
- new Runnable() {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- controlLamp = controlLamp.blackOut();
- }
- },
- 10,
- 10,
- TimeUnit.SECONDS);
- }
- }
- MainClass類的編寫
- 用for迴圈建立出代表12條路線的物件。
- 接著再獲得LampController物件並呼叫其start方法。
- 程式碼如下:
- public class MainClass {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- String[] directions = new String[] { "S2N", "S2W", "E2W", "E2S", "N2S",
- "N2E", "W2E", "W2N", "S2E", "E2N", "N2W", "W2S" };
- for (int i = 0; i < directions.length; i++) {
- new Road(directions[i]);
- }
- new LampController();
- }
- }</span>
相關文章
- 黑馬程式設計師程式設計師
- 黑馬程式設計師-Java概述程式設計師Java
- 程式設計師的燈下黑:“逗到底”的程式設計師程式設計師
- 黑馬程式設計師前端學習之路程式設計師前端
- 黑馬程式設計師——型別轉換程式設計師型別
- 黑馬程式設計師java筆記之一-----Map集合程式設計師Java筆記
- 黑馬程式設計師Linux系統開發視訊之VIM使用教程程式設計師Linux
- 黑馬程式設計師第七天程式設計師
- 黑馬程式設計師——Java高新技術---反射程式設計師Java反射
- 程式設計師的燈下黑:管理還是技術?興趣優先程式設計師
- 黑馬程式設計師—一張帖看完黑馬所有學科、班級就業薪資貼程式設計師就業
- 程式設計師的燈下黑:能認識自己嗎?程式設計師
- 程式設計師的燈下黑:沒學會快樂程式設計師
- 黑馬程式設計師_Java高新技術之列舉程式設計師Java
- 黑馬程式設計師——Java學習筆記之⑦——“網路程式設計”程式設計師Java筆記
- 程式設計師的燈下黑:Hands-on,Hands-on,Hands-on!程式設計師
- 程式設計師的燈下黑:重知識輕技術程式設計師
- PHP程式設計師面試題PHP程式設計師面試題
- 程式設計師的燈下黑:不要忘記你的目標程式設計師
- 【黑馬程式設計師濟南中心】代理模式-Cglib代理程式設計師模式CGLib
- 【黑馬程式設計師濟南中心】java基礎-陣列程式設計師Java陣列
- 黑馬程式設計師---學習筆記3:進位制程式設計師筆記
- 黑馬程式設計師Java培訓和Android培訓:程式設計基礎程式設計師JavaAndroid
- 程式設計師的燈下黑:堅持和良好心態近乎道程式設計師
- 程式設計師的燈下黑:臨淵羨魚和退而織網程式設計師
- 黑馬程式設計師_ios基礎總結1_IOS概述程式設計師iOS
- 黑馬程式設計師--java高新技術 25--列舉,反射程式設計師Java反射
- 程式設計師【黑話】指南程式設計師
- 一些有趣的程式設計師智力面試題程式設計師面試題
- 黑馬程式設計師Java培訓和Android培訓_java高新技術(一)程式設計師JavaAndroid
- 黑馬程式設計師Android實戰影片教程等,超過30程式設計師Android
- 黑馬程式設計師匠心之作-4.2物件的初始化和清理程式設計師物件
- 黑馬程式設計師——Java學習筆記之⑧——“Java新技術”程式設計師Java筆記
- 黑馬程式設計師Java培訓和Android培訓:列舉程式設計師JavaAndroid
- 黑馬程式設計師Java培訓和Android培訓:I/O程式設計師JavaAndroid
- 黑馬程式設計師Java培訓和Android培訓_IO(二)程式設計師JavaAndroid
- Java程式設計師面試題及解答Java程式設計師面試題
- 智力題(程式設計師面試經典)程式設計師面試