2014-11-05 91 views
0

我需要为交通灯编写迭代方法。这个想法是,红色是3分钟,然后它打开绿色,它是2分钟,然后打开黄色,它是1分钟,然后再次切换红色一个。迭代方法应该迭代状态机一分钟。我明白,它应该通过开关盒来完成,但我无法猜测....请帮助我。java中的枚举类型,开关盒

public class TrafficLight 
{ 
    private enum State {RED, YELLOW, GREEN}; 

    public void iterate() 
    { 
     switch(state) 
     { 
      case RED: 
      break; 

      case GREEN: 
      break; 

      case YELLOW:  
      break; 
     } 

    } 

    public void setTimeForState(State state, int time) 
    { 

    } 
} 

对不起,该系统把我的帖子,也有关于setTimeForState方法,其中 改变的等待时间在交通信号灯的特定颜色。

+0

你可以使用'Timer',但我不知道在这里切换是nessesery – user902383 2014-11-05 15:48:46

+0

难道你的教授告诉你使用'switch/case'? – djv 2014-11-05 15:52:55

+0

目前还不清楚,setTimeForState()方法需要做什么。这是否意味着,你有一个开始状态,总时间(什么时间单位?),方法应该处理状态变化? – 2014-11-05 15:54:54

回答

0

你需要在你的类定义变量状态:

class TrafficLight { 
    enum State { 
     RED, YELLOW, GREEN 
    }; 

    State state = State.GREEN; 

    public void iterate() throws InterruptedException { 
     switch (this.state) { 
     case RED: 
      System.out.println("RED"); 
      Thread.sleep(1000); 
      this.state = State.GREEN; 
      break; 

     case GREEN: 
      System.out.println("GREEN"); 
      Thread.sleep(1000); 
      this.state = State.YELLOW; 
      break; 

     case YELLOW: 
      System.out.println("YELLOW"); 
      Thread.sleep(1000); 
      this.state = State.RED; 
      break; 
     } 

    } 

而且在每种情况下等待一段时间看跌状态到下一个值。

public static void main(final String[] args) throws InterruptedException { 

    final TrafficLight a = new TrafficLight(); 
    while (true) { 
     a.iterate(); 
    } 
} 
+0

谢谢你的回答,我编辑了这篇文章。如果我使用线程,那么如何在setTimeForState方法中更改等待时间? – JeyKo 2014-11-05 18:30:07

0

这里是路灯模拟器,它使用计时器开关:

import java.util.Timer; 
import java.util.TimerTask; 

public class TrafficLight { 

    static Timer timer =new Timer(); 

    private enum State { 
     RED(3l), YELLOW(1l), GREEN(3l); 
     Long time; 

     State(Long time) { 
      this.time = time * 1000 * 60; 
     } 

    }; 

    State state= State.RED; 
    boolean direction = true; 

    private static class ChangeState extends TimerTask { 
     public ChangeState(TrafficLight lights) { 

      this.lights = lights; 
     } 


     private final TrafficLight lights; 


     @Override 
     public void run() { 

      switch (lights.state){ 
      case RED: 
       lights.direction = false; 
       lights.state = State.YELLOW; 
       break; 
      case YELLOW: 
       if (lights.direction) 
        lights.state = State.RED; 
       else 
        lights.state = State.GREEN; 
       break; 
      case GREEN: 
       lights.direction = true; 
       lights.state = State.YELLOW; 
       break; 
     } 
     System.out.println(lights.state); 
      timer.schedule(new ChangeState(lights),1000);// state.time); 
     } 
    }; 

    public void run(){ 
     System.out.println("state"); 
     timer.schedule(new ChangeState(this), state.time); 
    } 




    public static void main(String[] a) { 
     (new TrafficLight()).run(); 
    } 

}