java 面试题---交通灯

这是一题笔试题,题目是实现一个交通灯管理系统,就是我们路口的红绿灯(不考虑黄灯),每辆车通过路口时间为1S,随机生成车辆和红绿灯交换时间间隔自定,可以设置,不需要做界面的实现。

看题目,我们先要理清思路再去写,首先想清楚交通灯是什么一个情况的:
有直行的,左拐的,右拐的。
1.所有车同时直行,肯定是要撞上了,只能东西方向直行,或者是南北方向直行。
2.所有路口的车辆同时左拐是可以的
3.所有车辆同时右拐也是可以的。


问题理清楚了,我们就开始试着去将它抽象出一个程序模型出来:
1:路可以作为一个对象,路上对应的灯可以作为是路的一个变量(最好是bool型的,有true or false两种情况),路上的车也是路德变量,红灯的时候增加,绿灯的时候减少。
2:这样的话我们只需要考虑四条线路,然后定义路上的车辆和红绿灯,让他们按照规律进行变化
3:这样我们就可以将问题抽象为 四个路线对象(东西,南北,所有路口左转的,所有路口右转的)
4:路对象的红绿灯呢在 true false之间跳转。
5:路对象的车变量在红灯的时候增多,绿灯的时候减少。

这样我们的模型就抽象出来了,我们只需要考虑四条路线随时间变化的情况。

模型抽象出来了,接下来我们再看一下实现这个模型需要用到哪些技术,和需要处理的技术细节。
1.四条路的状态时同时在变的(所以我们这里肯定是要用到多线程,没有二话的)
2.四条路线,在同一时间点只能有一个是绿灯,其他必须是红灯(否则撞车了)
  a:要实现这个,我们把一个时间分为四份,每条路线占据的绿灯时间为四分之一,
  b:这些路线的红绿灯按照一定的规律亮绿灯(绿红红红 红绿红红 红红绿红 红红红绿)这样的一个顺序一直变化下去(怎么实现呢,我们可以理想化一点,在我的程序里,我先定义一个路线,在绿灯时间过后定义第二个路线,这样一直到第四个路线)这样实现后,他们会按照指定的时间一直有规律的变化下去
3.当路口是红灯的时候,我们路上的车会越来越多,对车辆进行增加操作,当路口是绿灯的话,我们的车辆就进行减少,一直这样进行下去。
4.需要时间可以设置,那太简单了,我们只需要给它增加一个 settime()函数就OK拉。

下面是我实现的程序,没花时间在细节上,只是大概给它把功能实现了一下,肯定会有很多问题,也希望高手能贴出自己的解法,不吝赐教(当然这题目是源于张孝祥老师的一个视频,因为一些原因,我没有办法看那个视频,所以自己记下了题目,写了下,希望不会有板砖),也欢迎大家指正出里面的不足之处(毕竟我刚刚接触java),非常感谢了。

package Lamp;

/**
交通灯
*/
class road implements Runnable
{
 int carnum = 0 ;
 int time; //随机生成车辆的时间间隔
 Lamp la; //监视灯的状态
  
 road(int time,String name,Boolean state,int lamptime)
 {
  this.time = time;//初始化红绿灯时间
  la = new Lamp(name,state,lamptime);
  new Thread(la).start(); //启动灯监控线程
 }
  
 /*生成车辆时间间隔设置*/
 void settime(int time)
 {
  this.time = time;
 }
  
 @Override
 public void run()  
 {
  while(true)
  {
  /*如果是绿灯,让车辆减少,否则,增加*/
  if(la.state)
  {
  try  
  {
  Thread.sleep(1000);
  }
  catch (InterruptedException e)  
  {
  e.printStackTrace();
  }
  if(carnum>0)
  carnum--;
  System.out.println("name: "+la.name+" state: "+la.state+" num: "+carnum);
  }
  else
  {
  try  
  {
  Thread.sleep(1000);
  }  
  catch (InterruptedException e)  
  {
  e.printStackTrace();
  }
  carnum++;
  System.out.println("name: "+la.name+" state: "+la.state+" num: "+carnum);
  }
  }
 }

}

class Lamp implements Runnable
{
 String name;
 Boolean state = true;
 int time;

 Lamp(String name,Boolean state,int time)
 {
  this.name = name;
  this.state = state;
  this.time = time;
 }
  
 /*红绿灯时间间隔设置*/
 void settime(int time)
 {
  this.time = time;
 }
  
 @Override
 public void run()  
 {
  // TODO Auto-generated method stub
  while(true)
  {
  if(state)
  {
  try {
  Thread.sleep(this.time*1000); //绿灯亮 time时间
  }  
  catch (InterruptedException e)  
  {
  e.printStackTrace();
  }
  state = false;
  }
  else
  {
  try  
  {
  Thread.sleep(3*(this.time*1000));//红灯亮 3*time时间
  }  
  catch (InterruptedException e)  
  {
  e.printStackTrace();
  }
  state = true;
  }
  }
 }
}

/*
 * 根据红绿灯常识,我们可以知道,南北向路口红绿灯是一个颜色的,所有东西向路口红绿灯是一个颜色的
 * 所有路口左转(右转)红绿灯是一个颜色的(所有路口车辆左转(右转),不会有相交的)
 * 四种灯在同一个时间,只能有一个是绿灯,其他必须为红灯,一次循环。
 */
public class Lampcontrol
{
 public static void main(String[] args) throws InterruptedException
 {
  /*让第一个路口启动*/
  road r1 = new road(1,"r1",true,10);
  new Thread(r1).start();
   
  Thread.sleep(r1.la.time*1000);

  /*让第二个路口启动*/
  road r2 = new road(1,"r2",true,10);
  new Thread(r2).start();
   
  Thread.sleep(r1.la.time*1000);

  /*让第三个路口启动*/
  road r3 = new road(1,"r3",true,10);
  new Thread(r3).start();

  Thread.sleep(r1.la.time*1000);
   
  /*让第四个路口启动*/
  road r4 = new road(1,"r4",true,10);
  new Thread(r4).start();
 }
}


下面是我的运行结果,因为处理过于简单,我需要做一下说明:
(为了容易看清,我把红绿灯时间改成了 3S ,方便我们看清)
name: r2 state: false num: 31
name: r3 state: true num: 30
name: r1 state: false num: 34
name: r4 state: false num: 31
name: r2 state: false num: 32
name: r3 state: false num: 29
name: r1 state: false num: 35
name: r4 state: true num: 32
name: r2 state: false num: 33
name: r3 state: false num: 30
name: r4 state: true num: 31
name: r1 state: false num: 36
name: r2 state: false num: 34
name: r3 state: false num: 31
name: r4 state: true num: 30
name: r1 state: false num: 37
name: r2 state: false num: 35
name: r3 state: false num: 32
name: r4 state: false num: 29
name: r1 state: true num: 38
name: r2 state: false num: 36
name: r3 state: false num: 33
name: r4 state: false num: 30
name: r1 state: true num: 37
name: r2 state: false num: 37
name: r3 state: false num: 34
name: r4 state: false num: 31
name: r1 state: true num: 36
name: r2 state: true num: 38
name: r3 state: false num: 35
name: r4 state: false num: 32
name: r1 state: false num: 35
name: r2 state: true num: 37
name: r3 state: false num: 36
name: r4 state: false num: 33
name: r1 state: false num: 36
name: r2 state: true num: 36
name: r3 state: false num: 37
name: r4 state: false num: 34
name: r1 state: false num: 37
name: r1 state: false num: 38
name: r2 state: false num: 35
name: r3 state: true num: 38
name: r4 state: false num: 35
name: r1 state: false num: 39
name: r4 state: false num: 36
name: r2 state: false num: 36
name: r3 state: true num: 37
name: r1 state: false num: 40
name: r4 state: false num: 37
name: r2 state: false num: 37

我们可以在结果里看一下,四个路口始终保持只有一个为true,true的时候车辆是减少的(每秒一辆),false的时候是增加的(每秒一辆)。
当然我们也可以看到我的数据肯定是有问题的,因为这样很快马路就会堵死了,所以这应该相当于现实生活中的堵车了,哈哈,所以理论时间是产生车辆需要小于等于通行车辆的1/4就是最佳状态哦,呵呵

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值