java实现细胞自动机

这篇文章将解决在Java中实现有限状态机的问题。 如果您不知道什么是FSM或在什么地方可以使用FSM,您可能会热衷于阅读本 , 本和本 。

如果您发现自己在设计上使用FSM的情况,则可能已经开始为实现相同接口的每个状态编写类。 一个好的设计可能是:

interface State { }
class State_1 implements State {}
class State_2 implements State {}
...

您可能有一个类可以管理这些状态以及它们之间的过渡,而另一个可以实现FSM的上下文(输入带状区域),另一个用于起始状态的接口,另一个用于结束状态的接口,依此类推。 许多类散布在许多文件中,使您无法快速跟踪它们。

还有另一种方法:使用枚举。

枚举本质上是类的列表,并且枚举的每个成员可能具有不同的实现。 假设我们要实现以下状态机:

初始化-('a')-> A
初始化-(else)->失败
A-('b')-> B A-('c')-> C A-('a')-> A A-(”)->结束 A-(其他)->失败 B-('c')-> C B-('b')-> B B-(”)->结束 B-(其他)->失败 C-('c')-> C C-(”)->结束 C-(其他)->失败

该FSM将验证以下正则表达式:^(a +)(b *)(c *)$。 我们可以将状态写成枚举状态的元素,如下所示:

interface State {public State next();
}
class Input {private String input;private int current;public Input(String input) {this.input = input;}char read() { return input.charAt(current++); }
}enum States implements State {Init {@Overridepublic State next(Input word) {switch(word.read()) {case 'a': return A;default: return Fail;}}},A {@Overridepublic State next(Input word) {switch(word.read()) {case 'a': return A;case 'b': return B;case 'c': return C;case '': return null;default: return Fail;}}},B {@Overridepublic State next(Input word) {switch(word.read()) {case 'b': return B;case 'c': return C;case '': return null;default: return Fail;}}},C {@Overridepublic State next(Input word) {switch(word.read()) {case 'c': return C;case '': return null;default: return Fail;}}},Fail {@Overridepublic State next(Input word) {return Fail;}};public abstract State next(Input word);
}

我们要做的是定义每个枚举中每个状态的转换。 每个过渡都会返回一个新状态,因此我们可以更有效地循环遍历它们:

State s;
Input in = new Input("aabbbc");
for(s = States.Init; s != null || s != States.Fail; s = s.next(in)) {}if(s == null) {System.out.printlin("Valid!");}
else {System.out.println("Failed");}

此时,我们要么验证了字符串,要么失败了。 这是一个简单而优雅的设计。

我们可以通过将最终状态与主要状态分开来进一步改善实现,以简化遍历的退出条件。 我们将定义另一个名为FinalState的接口,以及一个将包含所需退出状态的第二枚举(相应地更改States枚举):

interface FinalState extends State {}
enum FinalStates implements FinalState {Fail {@Overridepublic State next(Input word) {return Fail;}},Ok {@Overridepublic State next(Input word) {return End;}}
}

这样,遍历将有所简化:

for(s = States.Init; !(s instanceof FinalState); s = s.next(in)) {}
switch(s) {case Fail: System.out.printlin("Failed"); break;case Ok: System.out.println("Valid!"); break;default: System.out.println("Undefined"); break;
}

优点是(除了更简单的遍历之外),我们可以指定两个以上的最终状态。 在大多数情况下,FSM将有多个出口点,因此建议从长远来看最后一种改进。 您还可以将所有这些枚举和接口放在同一源文件中,并将整个逻辑放在一个位置,而不是浏览多个选项卡,以便了解流程的工作原理。

结论是,使用枚举可以更紧凑,更有意义地实现FSM。 您将所有逻辑都放在一个文件中,并且所有遍历都是轻松的。 您还将获得更加轻松的调试体验,因为已转换状态的名称将显示在调试器中(变量s将相应地更改其值,并带有新状态的名称),而不必弄清楚您刚刚上过什么课。 总而言之,我认为这是一个好技术。

参考:我们的JCG合作伙伴 Attila-Mihaly Balazs 在Java中实现自动机   在Transylvania JUG博客上。

翻译自: https://www.javacodegeeks.com/2012/03/automaton-implementation-in-java.html

java实现细胞自动机

java实现细胞自动机_Java自动机实现相关推荐

  1. 用java的io做一个代码计数器,如何制作Java页面计数器_java

    大庆采油六厂采油工艺研究所 王兵 王波 常常逛WWW的人,一定对许多起始页上的计数器感兴趣.每当你光临某个站点的起始页时,它的计数器就很亲切地告诉你,从某年某月某日开始,你是第几位光临的人.你可能也想 ...

  2. 【源码+图片素材+详细教程】Java游戏开发_Java开发经典游戏飞翔的小鸟_飞扬的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java课程设计项目

    课程目标: 1.通过本课程的学习巩固Java的相关基础知识,例如循环判断,数组和集合的使用,对象的继承,接口的实现,窗口的创建,事件监听,图形绘制. 2.完成小鸟的移动,管道自动生成.碰撞死亡,计分系 ...

  3. 【源码+教程】Java桌球游戏_Java初级项目_Java练手项目_Java项目实战_Java游戏开发

    今天分享的Java开源游戏项目是桌球游戏,初学者也可以用来练习喔~课程详细讲解了一个桌球游戏的编写思路和流程,即使你刚学Java没多久,也可以跟随该教程视频完成属于你自己的桌球游戏!同时,还可以加深和 ...

  4. 【源码+项目部署】Java课程设计项目_Java人力资源管理系统

    对就业和毕业都有帮助的Java实战项目来咯--人力资源管理系统! 人力资源管理系统 |Java项目2小时上手编写_源码+数据库拿走不谢!Java实战项目_Java开发https://www.bilib ...

  5. java 股票 代码_Java中利用散列表实现股票行情的查询_java

    ---- 在java中,提供了一个散列表类Hashtable,利用该类,我们可以按照特定的方式来存储数据,从而达到快速检索的目的.本文以查询股票的收盘数据为例,详细地说明java中散列表的使用方法. ...

  6. java校验文件格式_java验证文件格式工具类(获取文件真实格式)

    , String>();privateVerifyFileType(){} static{ getAllFileType();//初始化文件类型信息} /*** Discription:[get ...

  7. java实现细胞自动机

    细胞自动机的java实现 一丶 先说说这个题目吧,还是第一次接触这种类型的题目:生命游戏中,对于任意细胞,规则如下: 每个细胞有两种状态-存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动. 当 ...

  8. 算法java语言描述_java语言描述数据结构与算法崔笑颜的博客

    java语言描述数据结构与算法崔笑颜的博客 冒泡排序 插入排序 选择排序 希尔排序 快速排序 归并排序 二分查找package com.demo.test; import java.util.Arra ...

  9. java线程触发_java线程

    线程. 状态 新建状态(New): 当用 new 操作符创建一个线程时, 例如 new Thread(r),线程还没有开始运行,此时 线程处在新建状态. 当一个线程处于新生状态时,程序还没有开始运行线 ...

最新文章

  1. 【Binder 机制】AIDL 分析 ( AIDL 通信完整流程梳理 )
  2. 2.安装号mysql后当重启Linux服务器之后发现进入不了的解决方案
  3. np读取csv文件_pandas.read_csv函数参数详解
  4. 完全开源版可乐个人发卡网无授权完整运营版/整合最新免签约支付接口
  5. java8+tomcate8仅支持TLSv1.2
  6. python怎样编写姓名、职业、地址_如何根据姓名、地址识别人际关系,然后通过linux comman或Pysp分配相同的ID...
  7. 红外传感器型号和参数_浅析温度传感器原理
  8. mysql sakila world_MySQL 安装示例数据库(employee、world、sakila、menagerie 等)
  9. 经典排序算法(十八)--Proxmap Sort
  10. 背诵华为hcia认证考试题库答案能过吗?华为认证等级是怎样的
  11. logo是啥_logo什么意思_LOGO是什么意思
  12. 彻底了解DVD:从入门到精通(三)[转]
  13. opengl——贴图
  14. 公众号里面套页面_怎么套用别人的公众号模板,如何套用微信图文模板
  15. 什么是PM?团队角色
  16. 时间转化为字符串格式的方法
  17. loc入门案例和解读,带你快速了解spring的loc
  18. python练习题,使用爬虫爬取百度百科内置BeautifulSoup安装方法
  19. lms c语言,LMS算法实现自适应滤波器(C语言版)
  20. IHS分析师:折叠屏幕手机2017年前难上市

热门文章

  1. 接口 DataInput
  2. 2020蓝桥杯省赛---java---B---2(寻找 2020)+测试txt
  3. 迪杰斯特拉算法(最短路径)
  4. flume的配置和开启
  5. encipher.min.php,陌屿授权系统(5.7)最新版 网站授权 - 下载 - 搜珍网
  6. linux-basic(11)认识和学习bash
  7. linux-basic(10)vim程序编辑器
  8. xmpp协议框架包介绍:org.xmpp.packet.Packet+JID+PacketInterceptor+Session
  9. kafka 发布-订阅模式_使用Apache Kafka作为消息系统的发布-订阅通信中的微服务,并通过集成测试进行了验证...
  10. jdk8 string::_JDK 12的String :: transform方法的简要但复杂的历史