黑马程序员_7k面试题交通管理系统
------- android培訓、java培訓、期待與您交流! ----------
?
//以下知識來在張孝祥老師的講解總結
項目需求
模仿實現十字路口的交通燈系統邏輯,具體需求如下
1.異步隨機生成按照各個線路行駛的車輛
例如:
由南而來去往北向的車輛......直行車輛
由西而來去往南向的車輛......右轉車輛
由東而來去往南向的車輛......左轉車輛、
2.信號燈忽略黃燈,只考慮紅燈和綠燈
3.應考慮左轉車輛受信號燈控制,右轉車輛不受信號燈控制
4.具體信號燈邏輯與現實生活中普通交通燈控制邏輯相同,不考慮特殊情況下的邏輯
注:南北向車輛與東西向車輛交替放行,同方同等待車輛應先放行直行車輛而后放行左轉車輛
5.每輛車過路口時間為1秒(可通過線程Sleep的方式模擬)
6.隨機生成車輛時間隔以及紅綠燈交換時間自定,可以設置
7.不要求實現GUI,只考慮系統邏輯實現,可通過Log方式展示程序運行結果
畫圖:
總共有12條路線,為了統一編程模型,可以假設每一條路線都有一個紅綠燈對其進行控制:
1.右轉彎的4條路線的控制燈可以假設稱為常綠狀態
2.其它8條路線是兩兩成對的,可以歸為4組
3.所以程序只考慮圖中標注了數字號的4條路線的控制燈的切換順序,這4條路線相反方向的路線的控制燈跟隨這4條線路切換,不必額外考慮
面向對象的分析與設計
1.每條線路上都會出現多輛車,路線上要隨機增加新的車,在燈綠期間還要每秒減少1輛車
設計一個Road類來表示路線,每個Road對象代表一條路線,總代有12條路線,即系統中總共產生12個Road實例對象
每條線路上隨機增加新的車輛,增加到一個集合中保存
每條線路每隔一秒就會檢查本線路的燈是否為綠,是則將本線路保存車的集合中的第一輛車移除,即表示車穿過了路口
2.每條線路每隔一秒就會查檢本線路的燈是否為綠,一個燈由綠變紅時,應該將下一個方向的燈變綠
設計一個Lamp類來表示交通燈,每個交通燈都維護一個狀態,:亮(綠)或者不亮(紅),每個交通燈要有變亮和變黑的方法,并且能返回自己的亮黑狀態
總共有12條線路,所以,系統總共要產生12個交通燈,右轉彎的線路本來不受燈的控制,但是為了讓程序采用統一處理的方式,故假設出有4個右轉彎的燈,只是這些燈為常亮狀態,即永遠不變黑
除了右轉彎方向的其它8條線路的燈,它們是22成對的,可以歸為4組,所以在編程處理時,只要從這四組里各取出一個燈,對這4個燈依次輪換變亮,與這4個燈方向對應的燈則隨之統一變化,因此Lamp類中要有一個變量來記住自己相反的燈,在一個Lamp對象的變亮和變量方法中,將對應方向的燈也變亮和變黑,每個燈變亮時,都伴隨著下一個燈的變黑
Road類的編寫
1.每個Road類都有一個name成員變量來代表方向,有一個vehicles成員變量來代表方向上的車輛集合
2.在Road對象的構造方法中啟動一個線程每隔一個隨機時間向vehichles集合中增加一輛車(用一個“路線名_id”形式的字符串表示)
3.在Road對象的構造方法中啟動一個定時器,每隔一秒查檢方向上的燈是不是為綠,是則打印車輛集合并將集合中的第一輛車移除掉
?package com.isoftstone.interview.traffic;
?
?import java.util.ArrayList;
?import java.util.List;
?import java.util.Random;
?import java.util.concurrent.ExecutorService;
?import java.util.concurrent.Executors;
?import java.util.concurrent.ScheduledExecutorService;
?import java.util.concurrent.TimeUnit;
?
?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;i<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 = true;
???????????????????????????? //假如燈是綠的
???????????????????????????? if(lighted){
???????????????????????????????? System.out.println(vechicles.remove(0)+" is traversing!");
???????????????????????????? }
???????????????????????? }
???????????????????? }
???????????????? },
???????????????? 1,
???????????????? 1,
???????????????? TimeUnit.SECONDS);
???? }
?}
?Lamp枚舉的編寫
?package com.isoftstone.interview.traffic;
?
?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,false),E2N(null,null,false),N2W(null,null,false),W2S(null,null,false);
????
???? 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();
???????????? //opposite.lighted=true;
???? }
???? //燈變黑的方法
???? public Lamp blackOut(){
???????? this.lighted = false;
???????? if(opposite!=null)
???????????? Lamp.valueOf(opposite).blackOut();
????????
???????? Lamp nextLamp = Lamp.valueOf(next);
???????? if(next != null)
???????????? Lamp.valueOf(next).light();
???????? return nextLamp;
???? }
?}
LampController的編寫
?package com.isoftstone.interview.traffic;
?
?import java.util.concurrent.Executor;
?import java.util.concurrent.Executors;
?import java.util.concurrent.ScheduledExecutorService;
?import java.util.concurrent.TimeUnit;
?
?public class LampController {
???? //當前的燈
???? private Lamp currentLamp;
????
???? //初始化南到北的燈綠
???? public LampController(){
???????? currentLamp = Lamp.S2N;
???????? currentLamp.light();
????????
???????? //每隔十秒,燈變紅
???????? ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
???????? timer.scheduleAtFixedRate(
???????????????? new Runnable(){
???????????????????? public void run(){
???????????????????????? currentLamp = currentLamp.blackOut();
???????????????????? }
???????????????? },
???????????????? 10,
???????????????? 10,
???????????????? TimeUnit.SECONDS);
???? }
?}
主函數的編寫
?package com.isoftstone.interview.traffic;
?
?public class MainClass {
????
???? public static void main(String[] args){
????????
???????? 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();
???? }
?}
?
轉載于:https://www.cnblogs.com/chen-bao-feng/archive/2013/03/22/2975896.html
總結
以上是生活随笔為你收集整理的黑马程序员_7k面试题交通管理系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用列表选择框控件
- 下一篇: 八皇后问题 递归求解法