黑马程序员——Java面试题之交通灯调度系统

面对对象设计

面对对象设计思想:把方法定义在合适的对象上。

人在黑板上画圆,其实是调用圆的构造方法。

司机刹车,实际上刹车的方法在车上面,我们只是调用刹车的方法,刹车的方法在车上。

class Circle1{

double r ;

public Circle1( double r) {

this. r = r;

}

}

new对象就能新建一个圆,计算机的世界也不等同现实世界,不能说徒手画得不圆,不圆的是曲线就不是圆了。

路上的汽车减少,是路增加一个汽车或者减少一个汽车

小球怎样从绳子一端移动到另一端

//假设绳子由n点Point组成,小球是point0

class wire{

int len ;

ArrayList al= new ArrayList() ;

//假设绳子由n点Point组成,小球是point0

wire ( int len ){

this. len= len;

for (int i= 0; i< len; i++ )

al .add ("point" + i) ;

}

//小球移动就是从这点到下一点移动直到走完全程

public void move (){

for (int m= 0; m< len- 1; m++ ){

Collections .swap (al , m , m +1 );

}

}

}

public class thinkinginoop {

public static void main ( String[] args ) {

// TODO Auto-generated method
stub

wire ww =new wire (10 );

ww .move ();

System .out .println ( ww. al) ;

}

/*      [point1,
point2, point3, point4, point5, point6, point7, point8, point9,
point0]*/

对象本身无法使自己变成另一个对象。

石头磨成石刀或者木头变成椅子

class Stone{

String name= "Stone" ;

}

class StoneKnife{

String name= "StoneKnife" ;

}

class StoneFactory{

public StoneKnife
makeKinfe( Stone stone ){

StoneKnife
sk = new StoneKnife ();

stone = null;

return sk;

}

}

public class thinkinginoop {

public static void main ( String[] args ) {

// TODO Auto-generated method
stub

Stone
st = new Stone ();

System .out .println ( st. name) ;

StoneFactory sf =new StoneFactory ();

//石头不存在了,只剩下StoneKnife

System .out .println ( sf. makeKinfe( st ). name) ;

/*Stone

Stoneknife*/

交通灯调度系统

十字路口上总共有12条线路,每条路上的汽车数是随机添加的,当该路线上绿灯亮时,该线路上的汽车按一定时间减少,表示其通过路口,红灯时不减少,但是添加会一直进行。

张孝祥老师这道题做得挺漂亮的,下面学习一下张老师的代码。

交通灯类的实现

public enum Lamp {

S2N1 ("N2S5" ,"S2W2" , false) ,S2W2 ( "N2E6", "E2W3", false ), E2W3( "W2E7", "E2S4", false ), E2S4( "W2N8", "S2N1", false ),

N2S5 (null , nullfalse) , N2E6nullnullfalse) , W2E7nullnullfalse) , W2N8nullnullfalse) ,

S2E9 (null , nulltrue) , E2N10nullnulltrue) , N2W11nullnulltrue) , W2S12nullnulltrue) ;

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

this. next = next;

this. opposite = opposite;

this. lighted = lighted;

}

private String next ;

private String opposite ;

private boolean lighted;

public boolean isLighted (){

return lighted ;

}

public void lightOn (){

this. lighted= true;

if (! this. opposite. equals( null ))

Lamp .valueOf (opposite ). lighted= true;

System . out. println( name () + "
lamp is green,下面总共应该有6个方向能看到汽车穿过!" );

}

public Lamp
lightOff(){

this. lighted= false;

if (! this. opposite. equals( null ))

Lamp .valueOf (opposite ). lighted= false;

if (! this. next. equals( null ))

Lamp .valueOf (next ). lightOn ();

return Lamp. valueOf( next) ;

}

}

首先这是一个枚举类,十二条线路的交通灯,分成三种构造,现实的交通灯也是这样的,分成4种情况。开灯表示绿灯亮,同时把该线路的相反方向的灯也打开,关闭也同理,关闭的同时打开下一条线路的灯,如此循环不断。

Lamp系统

用于控制线路等的开关间隔。

public class LampSystem {

private Lamp currentlamp ;

LampSystem (){

currentlamp= Lamp. S2N1;

currentlamp. lightOn ();

ScheduledExecutorService
contrl =Executors .newScheduledThreadPool ( 1) ;

contrl .scheduleAtFixedRate ( new Runnable (){

public void run () {

currentlamp= currentlamp. lightOff ();

// TODO Auto-generated method
stub

}}, 10, 10, TimeUnit. SECONDS );

}

}

这里采用的是调控线程,每隔一段时间就会执行一次run,非常好用的时间控制器。因为Lamp对象只知道自己怎么关灯和怎么开灯,但是什么时候开,什么时候关,它是不知道的,这个事情Lamp系统才是最清楚的。

Road类

用于描述线路的车辆添加和移除。

public class Road {

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

private String name ;

public Road( String
name ) {

super ();

this. name = name;

ExecutorService
addcar =Executors .newSingleThreadExecutor ();

addcar .execute ( new Runnable (){

public void run () {

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

try {

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

catch (Exception e ) {

// TODO: handle exception

e .printStackTrace ();

}

Road . this. Vechicles. add( "vechicle" +"i" );

}

}

});

ScheduledExecutorService
cross =Executors .newScheduledThreadPool ( 1) ;

cross .scheduleAtFixedRate ( new Runnable (){

public void run () {

// TODO Auto-generated method
stub

if (Road . this. Vechicles. size() >0 ){

if (Lamp .valueOf (Road . this. name) .isLighted ())

System . out. println( Road. this. name+ ">>>" +Road . this. Vechicles. remove( 0 ) + "
is traversing !" );

}

}

}, 1, 1, TimeUnit. SECONDS ); }

}

这里用的是两条独立的线程,一条线程用于添加车辆,每条线路都能随机时间(1到10秒)添加汽车。另一条线程是用来描述汽车通过路口的情形,当绿灯时,检测线路上是否有车,有车就移除前面一辆,没有就等待,下一秒继续检测。

测试类

测试系统。

// TODO Auto-generated method
stub

String [] directions= {"S2N1" ,"S2W2" ,"E2W3" ,"E2S4" ,"N2S5" ,"N2E6" ,"W2E7" ,"W2N8" ,"S2E9" ,"E2N10" ,"N2W11" ,"W2S12" };

for (int i= 0; i< directions. length; i++ )

new Road( directions [i ]);

new LampSystem() ;

}

/*      S2N1
lamp is green,下面总共应该有6个方向能看到汽车穿过!

W2S12>>> vechiclei is
traversing !

N2S5>>> vechiclei is
traversing !

W2S12>>> vechiclei is
traversing !

S2N1>>> vechiclei is
traversing !

S2E9>>> vechiclei is
traversing !

S2N1>>> vechiclei is
traversing !

E2N10>>> vechiclei is
traversing !

N2W11>>> vechiclei is
traversing !

N2S5>>> vechiclei is
traversing !

N2W11>>> vechiclei is
traversing !

N2S5>>> vechiclei is
traversing !

S2E9>>> vechiclei is
traversing !

N2W11>>> vechiclei is
traversing !

S2W2
lamp is green,下面总共应该有6个方向能看到汽车穿过!*/

把线路对象和Lamp系统对象构建好就行。会自动执行构造函数里的线程。

时间: 2024-10-26 18:29:28

黑马程序员——Java面试题之交通灯调度系统的相关文章

黑马程序员——Java面试题之银行业务调度系统

                       android培训.java培训.期待与您交流!  对象分析: 1.客户类按照业务分类,客户可以分成三类. public enum Custommer { COMMON ,VIP , EXPRESS; public String toString(){ String name =null ; switch (this ){ case COMMON : name ="普通" ; break; case VIP : name ="VI

黑马程序员-java 7K面试题之交通灯管理系统

------- android培训.java培训.期待与您交流! -------- 交通灯管理系统 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 1. 异常随机生成按照各个路线行驶的车辆. 例如: 由南向而来去往北向的车辆----直行车辆 由西向而来去往南向的车辆----右转车辆 由东向而来去往南向的车辆----左转车辆 .......  ...... 2. 信号灯忽略黄灯,只考虑红灯和绿灯. 3. 应该考虑左转车辆控制信号灯,右转车辆不受信号灯控制. 4. 具体信号灯控制逻辑与现实

黑马程序员-java 7K面试题之银行业务调度系统

------- android培训.java培训.期待与您交流! -------- 银行业务调度系统 模拟实现银行业务调度系统逻辑,具体需求如下: 1. 银行有6个业务窗口,1-4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口. 2. 有三种对应类型的客户:VIP客户.普通客户.快速客户(办理如交水电费.电话费之类业务的客户). 3. 异步随机生成各种类型的客户,生成各类型用户的概率比率为: VIP客户:普通客户:快速客户=1:6:3 4. 客户办理业务所需时间有最大值和最小值,

黑马程序员——Java枚举和自动装箱

------- android培训.java培训.期待与您交流! ----------                                                                            枚举类和自动装箱     一.枚举      枚举由不重复的常量构成,在java中使用enmu关键字定义枚举,所有的枚举会自动继承java.lang.enmu. 比如定义交通灯的枚举. publicenumTrafficLamp { RED ,GREED,YEL

黑马程序员-入学笔试题

笔试结束,列一下笔试题和我的解答,最后得分29.7. 1. 编写一个类,在main方法中定义一个Map对象(采用泛型),加入若干个对象,然后遍历并打印出各元素的key和value. package com.itheima; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; public class Test1 { public static void m

黑马程序员——Java基础---IO(下)

黑马程序员——Java基础---IO(下) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供了File类.properties类.打印流.序列流等和输入输出相关的类,它们能够帮助我们更好的处理信息.下面将对它们进行简单的介绍. 一.正

黑马程序员——Java高新技术代理

代理 普通代理 很多时候,我们使用别人代码往往会发现别人代码的功能并不是十分符合我们的需求,调用别人的方法的时候,总是先new一个对象,然后我们的前处理做完,然后调用别人代码的方法,再加入后处理,这样做往往十分麻烦.代理就为其他类提供了一种控制其对象的方法.代理类和委托类必须实现同一个接口,这样代理类才能在需要的时候代替委托类对象,执行委托类的方法. interface Solution{ public void doSomething(); } //委托类Demo实现了接口 class Dem

黑马程序员——Java I/O流基础知识点(File类)

File工具 File类就是用俩将文件或者文件夹封装对象,弥补流对象的不足--流只能操作数据,不能操作文件夹的 封装的是路径!!! 构造方法演示 1.可以将已有的未出现的文件或者文件夹封装成对象. File f1=new File("c:\\abc\\a.txt"): File f2=new File("d:\\abc","ab.txt"打印,会打印路径.:目录分隔符,为了更好地跨平台File. File类常见功能 1,创建 createNewF

黑马程序员 ---------- Java网络技术之 ---正则表达式 (Day06)

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 正则表达式 正则表达式:基本知识 1  字符,   2 字符类 , 3 预定义字符类 , 4 边界匹配器 ,5 Greedy 数量词,6 Logical 运算符 详解: 1 字符 x   字符 x \\ 反斜线字符 \0n 带有八进制值 0 的字符 n (0 <= n <= 7) \0nn 带有八进制值 0 的字符 nn (0 <= n