黑马程序员——张孝祥老师7k面试题之交通灯

来源:互联网 发布:北京农大动物医院知乎 编辑:程序博客网 时间:2024/05/17 06:51

---------------------- android培训、java培训、期待与您交流! ----------------------

交通灯

在设计时第一个就提到了画图,这样既直观又容易明确,光靠想容易漏掉关键点。将一路口的所有行进方向画出来,按车来考虑,除了向右行进都应该看灯。按灯考虑应该是要给左转和直行设置灯,而不给右转灯,之前看张老师的枚举视频,看到交通灯很自觉地想到了该把灯设计成enum类型,所以不给右转设置灯的话可能比较复杂。一个路口是有4组灯,其中横竖两组灯是在同时坐着相同的动作,所以由其中一组灯来带动它对面的灯即可,一组灯中包括直行灯和左转灯,在竖组的直行灯有绿变红之后是左转灯变绿,此时竖组对面的灯也执行相同动作。当竖组的左转灯变红后,横组的灯开始和竖组灯一样的动作。

public enum Lamp{//这是给12条行进路线定义灯,大写字母代表方向,2代表to

N2S(false,"S2N","N2E"),N2E(false,"S2W","W2E"),W2E(false,"E2W","W2N"),W2N(false,"E2S","N2S"),//由此行的路线灯来主导,第二行的灯跟着变化

S2N(false,null,null),S2W(false,null,null),E2W(false,null,null),E2S(false,null,null),

S2E(true,null,null),E2N(true,null,null),N2W(true,null,null),W2S(true,null,null);//此行的路线灯为右转灯

private boolean lighted;//定义一个布尔类型变量存储是否是绿灯

private String opposite;//定义对面的灯

private String next;//定义下一个灯

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

this.opposite=opposite;

this.next=next;

}

public boolean lighted(){}//定义一个供外界调用的判断方法

public void light(){}//定义一个交通灯变绿的方法,同时操作两组灯

public void lightOff(){}//定义一个交通灯变红的方法,同时操作两组灯

public Lamp 

}

由于路口的行进路线被确定为12条,只考虑通过路口,所以定义的road类要随机的给这条路线添加车辆并判断灯是否可以通行

public class Road(){

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


private String name=null;//定义车辆的名字,用路线表示

public Road(String name){

this.name=name;

//这里张老师用到了一个executors类来定义线程,用这个线程来不停的产生车辆,并用sleep方法每隔随机的时间,用new Random().nextInt(10)+1返回一个1到10的随机数,我对这个不了解就不写详细了,补补课之后再写

//另外定义一个计时器,在有车在绿灯的情况下,将集合中的vehicles移除对应的车辆。

}}}

在Road和Lamp定义好之后,要设计一个交通灯的控制器

public class LampController(){

private Lamp currentLamp;

LampController(){

currentLamp=Lamp.N2S;//将当前灯设置为北向南走向的,并点亮绿灯

currentLamp.light();

//这里还是一个executors来定义一个计时器,每过一定时间灯进行转换

}

}

接着main方法:

public static void main(String[] args){

String[] strBunch={"N2S","N2E","W2E","W2N","S2N","S2W","E2W",“E2S","S2E","E2N","N2W","W2S";}

for(int x=0;x<strBunch.length;x++)

{

new Road(strBunch[i]);

}

new LampController();

}

看张老师的视频,解决这个问题的代码并不难,主要是要理清这个问题的思路,要活学面向对象的知识,根据所要的需求能准确的定义出该使用的类,刚看题时我就认为不该给右转的车设计灯来减少代码,但是张老师使用枚举类型给右转车设计灯,让交通灯管理起来更统一,而将路设置成类我是完全没想到,自己的面向对象的分析能力还是不足,·未来的路还很长,我相信我的坚持最终会有回报的


---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima