1. 程式人生 > >黑馬程式設計師_Java學習筆記之7K面試題交通等管理系統

黑馬程式設計師_Java學習筆記之7K面試題交通等管理系統

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a>、期待與您交流! ----


7K面試題—交通燈管理系統
交通都能管理系統專案需求

模擬十字路口的交通燈管理系統邏輯,具體需求如下
1. 非同步隨機生成按照各個路線行駛的車輛,例如:
由南向而來去往北向的車輛------直行車輛
由西向而來去往南向的車輛------右轉車輛
由東向而來去往南向的車輛------左轉車輛


如上圖所示:一共有12條線路。不過可以簡化線路,首先考慮垂直的線路:只考慮從南往北的線路和從南邊轉彎的線路,從北向來的線路就不考慮,將其視為和從南向來的對應。然後再考慮水平的線路:從東往西的直行線路,從東面轉彎的線路,西向來的線路不考慮,視為和東向的對應。這樣,就將線路簡化為4條了。這4條線路如下:


    ①垂直向上。
    ②垂直向左拐。
    ③水平從東往西。
    ④從東往南。

2. 訊號燈忽略黃燈,只考慮紅燈和綠燈。
3. 應考慮左轉車輛受訊號燈控制,右轉車輛不受訊號燈控制。
4. 具體訊號燈控制邏輯與現實中的普通交通燈控制邏輯相同,不考慮特殊情況下的控制邏輯。注:南北向車輛與東西向車輛交替放行,同放行等待車輛應先放行直線車輛,而後放行左轉車輛。如上圖所示,若南往北綠燈(線路①S2N),北往南也為綠燈。當線路①為紅燈時,N2S也為紅燈,此時線路2(S2W)為綠燈。若東往西為綠燈(路線③E2W),西往東也為綠燈,當這兩個方向為紅燈後,線路④(E2S)為綠燈。

面向物件的思想剖析

設想一下有哪些物件:紅綠燈,紅綠燈的控制系統,汽車,路線。汽車看到自己所在路線對應的綠燈就穿過路口嗎?不是,還需要看起前面是否有車輛,看前面是否有車,該文哪個物件呢?該問路,路中儲存著車輛的集合,顯然路中應該有增加車輛和減少車輛的方法。再看題目,這裡並不需要體現車輛移動的過程,只是捕捉出車輛穿過馬路的過程,也就是捕捉路上車輛減少的過程,所以,這個車並不需要單獨設計成一個物件,用一個字串表示即可。所以,有3個物件:路、紅綠燈、紅綠燈控制系統。
面向物件把握的一個重要的經驗:誰擁有資料,誰就對外提供操作這些資料的方法。
交通燈控制系統的類的實現分析
每條路線上都會出現多輛車,路線上要隨機增加新的車,在燈綠期間還要每秒鐘減少一輛車。


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

編寫Road類中模擬汽車上路的程式碼
 * 每個Road物件代表一條路線,總共有12條路線,即系統中總共要產生12個Road例項物件。
 * 每條路線上隨機增加新的車輛,增加到一個集合中儲存。

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

public class Road {
// 路上的車輛
private List<String> vehiches = new ArrayList<String>();
private String name = null;//每條路線的名稱

public Road(String name) {
this.name = name;
//建立執行緒池
       ExecutorService pool =Executors.newSingleThreadExecutor();
//執行任務,即從執行緒池中選擇一個空閒執行緒執行該任務
       pool.execute(new Runnable() {
publicvoid run() {
//生成1000輛車
for(int i = 1; i <= 1000; i++) {
try {
//每隔隨機的1~10秒鐘,new Random().nextInt(10)返回0~9之間的隨機數
//也就是每隔1~10秒鐘隨機生成一輛車
                     Thread.sleep((new Random().nextInt(10)+1) * 1000);
                  } catch (Exception e) {
// TODO Auto-generated catch block
                     e.printStackTrace();
                  }
//Road.this.name表示外部類Road的成員變數,
vehiches.add(Road.this.name+"_"+i);
              }
           }
       });

//定時器
       ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);
       timer.scheduleAtFixedRate(
new Runnable() {
publicvoid run() {
//如果有車輛
if(vehiches.size() > 0) {
boolean lighter = Lamp.valueOf(Road.this.name).isLighted();
//假如燈是綠燈
if(lighter) {
                            System.out.println(vehiches.remove(0)+" is traversing !");
                         }
                     }
                  }
              },
              1, //經過1秒之後執行(執行鄰上面的Runnable內部類裡中內容)
              1, //再過1秒接著執行
              TimeUnit.SECONDS);//度量單位為:秒,表示上面的兩個 1的單位都是秒鐘

    }
// 路上的車輛
private List<String> vehiches = new ArrayList<String>();
private String name = null;//每條路線的名稱

public Road(String name) {
this.name = name;
//建立執行緒池
       ExecutorService pool =Executors.newSingleThreadExecutor();
//執行任務,即從執行緒池中選擇一個空閒執行緒執行該任務
       pool.execute(new Runnable() {
publicvoid run() {
//生成1000輛車
for(int i = 1; i <= 1000; i++) {
try {
//每隔隨機的1~10秒鐘,new Random().nextInt(10)返回0~9之間的隨機數
//也就是每隔1~10秒鐘隨機生成一輛車
                     Thread.sleep((new Random().nextInt(10)+1) * 1000);
                  } catch (Exception e) {
// TODO Auto-generated catch block
                     e.printStackTrace();
                  }
//Road.this.name表示外部類Road的成員變數,
vehiches.add(Road.this.name+"_"+i);
              }
           }
       });

相關推薦

黑馬程式設計師_Java學習筆記7K試題交通管理系統

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">

黑馬程式設計師——7k試題——交通管理系統

需求如下: 非同步隨機生成按照各個路線行駛的車輛。 訊號燈只考慮紅綠燈 要考慮左轉車輛控制訊號燈,右轉車輛不受訊號燈控制 具體訊號燈控制邏輯與顯示生活中交通控制邏輯上相同 每量車共過路口為1秒 隨機生成車輛時間間隔及紅綠燈交換時間間隔自定,可設定 不用GUI,用log展現

黑馬程式設計師_Java學習日記2_面向物件總結1

----------------------android培訓、java培訓、期待與您交流! --------------------- 1.關於main函式的講解 主函式,是一個特殊的函式,作為程式的入口,可以被jvm呼叫。 主函式的定義: public:代表該函式的許

黑馬程式設計師_Java學習日記25_高新技術4

----------------------android培訓、java培訓、期待與您交流! --------------------- 泛型 1.入門泛型的基本應用 JDK1.5的集合類希望你在定義集合時,明確表示你要向集合中儲存哪種型別的資料,無法加入指定型別以外的

黑馬程式設計師 C#學習筆記⑥ 三層架構基礎實現員工資訊管理

---------------------- ASP.Net+Unity開發、.Net培訓、期待與您交流! ---------------------- 三層架構定義 1、表現層(UIL):通俗講就是展現給使用者的介面,即使用者在使用一個系統的時候他的所見所得。 2、業

黑馬程式設計師--Java學習日記面向物件(封裝,繼承和構造方法)

------- android培訓、java培訓、期待與您交流! ---------- 面向物件思想:     面向過程,以函式為基礎,關注的是實現過程;     面向物件,以物件為基礎,關注的是最終結果; 面向物件思想特點         是一種更符合我們思想習慣的思想

黑馬程式設計師-OC學習筆記-----記憶體管理

移動裝置的記憶體極其有限,每個app所能佔用的記憶體是有限制的.當app所佔用的記憶體較多時,系統會發出記憶體警告,這時得回收一些不需要再使用的記憶體空間。比如回收一些不需要使用的物件、變數等。基本的資料型別是放在記憶體的棧裡面,這是不需要我們去管理的,系統會自動回收。但是

黑馬程式設計師 C#學習筆記⑤ 省市縣三級聯動查詢

---------------------- ASP.Net+Unity開發、.Net培訓、期待與您交流! ----------------------詳細請檢視:www.itheima.com 實現一個可以動態的進行省市縣查詢的程式 一 基本原理: 通過ADO.NET技

黑馬程式設計師_學習筆記JAVA基礎總結

1、方法過載 方法覆蓋 過載:一個類中一種功能的多種實現方式,呼叫哪種實現方式,根據呼叫者給出的引數。有兩個或多個方法方法名相同,但是引數型別或者引數個數或者引數順序不同。覆蓋:子類重寫父類的一個函式,函式名,引數,返回型別都相同。 覆蓋的應用: 當子類需要父

黑馬程式設計師--JQuery學習筆記

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS開發</a>、<a href="http://edu.csdn.net

黑馬程式設計師-IOS學習筆記(二)常用關鍵字和方法

------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流!------- 常用關鍵字和方法: 一.記憶體管理情況 1- autorelease,當用戶的程式碼在持續執行時,自動釋放池是不會被銷燬的,這段時間內使用者可以安全地使用自動釋放的物件。當

黑馬程式設計師 反射學習筆記

----------android培訓、java培訓、java學習型技術部落格、期待與您交流!---------- 反射:  “反射就是把Java類中的各種成分對映成相應的java類”,而在此之前,首先是必須獲得類的Class物件,再呼叫Class的相關方法,獲取例項類中

黑馬程式設計師--Java學習日記GUI&網路程式設計

------- android培訓、java培訓、期待與您交流! ---------- GUI 如何建立一個視窗並顯示  Graphical User Interface(圖形使用者介面)。   

黑馬程式設計師-OC學習筆記-點方法、成員變數作用域以及set方法和get方法@property的綜合題

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- 1.  OC建立物件的拓展: Frac

黑馬程式設計師--Java學習日記基礎知識(思維導圖&基礎概念)

------- android培訓、java培訓、期待與您交流! ---------- 什麼是常量      在程式執行的過程中其值不可以發生改變  Java中常量的分類    

黑馬程式設計師——C語言筆記資料型別與常量

------- android培訓、java培訓、iOS培訓、.Net培訓、期待與您交流! ---------- 1、什麼是資料型別 資料型別是指資料以何種方式儲存在記憶體中,不同的型別儲存方

黑馬程式設計師------試題------交通管理系統

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">

黑馬程式設計師_java基礎加強學習筆記註解

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">j

黑馬程式設計師_java基礎學習筆記(建構函式&構造程式碼塊&靜態程式碼塊)的區別

在基礎學習中,我常常會概念模糊,特作此學習筆記,進行一下對比,思路自然就清晰了。 建構函式 建構函式定義:建構函式是與類名相同,但沒有返回值的函式。 例子: class Person {     //建構函式     public Person() {} } 作用:

黑馬程式設計師----------7K試題交通管理

 ------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! -------