一个java的有限状态机

package lsm;


public interface Machine {
public String getStat();
public String input(String edge);
}

//

package lsm;


import java.util.ArrayList;


final public class MachineBuilder {


private class MiniMachine implements Machine {
Runnable[][] rs;
int[][] stats;
int current = 0;
String[] sts;
String[] eds;
Runnable er=null;
@Override
public String getStat() {
return sts[current];
}


@Override
public String input(String edge) {
int i = 0;
int last=current;
boolean find=false;
for (; i < eds.length; ++i) {
if (eds[i] == edge&&(stats[current][i]>0)) {
current = stats[current][i];
find=true;
break;
}
if (eds[i] != null && (eds[i].equals(edge))&&(stats[current][i]>0)) {
current = stats[current][i];
find=true;
break;
}
}
if(find){
if (rs[last][i] != null) {
((Runnable) rs[last][i]).run();
}
}else if(er!=null){
er.run();
}
return sts[current];
}


}


private String[] sts;
private String[] eds;
private Runnable er;
private ArrayList<Object[]> alst = new ArrayList<Object[]>();


public void putState(String[] stats) {
sts = stats;
}


public void putEdge(String[] edges) {
eds = edges;
}


public void putAction(String start, String edge, String dest, Runnable r) {
Object[] sr = new Object[4];
sr[0] = start;
sr[1] = edge;
sr[2] = dest;
sr[3] = r;
alst.add(sr);
}
public void setError(Runnable r){
er=r;
}
private boolean isSame(Object o1, Object o2) {
if (o1 == null) {
if (o2 == null) {
return true;
} else {
return false;
}
} else if (o1.equals(o2)) {
return true;
} else {
return false;
}
}


public Machine build() {
MiniMachine mm = new MiniMachine();
mm.eds = eds;
mm.sts = sts;
mm.stats = new int[sts.length][eds.length];
mm.rs = new Runnable[sts.length][eds.length];
mm.er=er;
for (int i = 0; i < mm.sts.length; ++i) {
for (int j = 0; j < mm.eds.length; ++j) {
mm.stats[i][j] = -1;
}
}
for (Object[] os : alst) {
int indexOfStat = -1;
int indexOfEdge = -1;
int destOfStat = -1;
for (int i = 0; i < mm.sts.length; ++i) {
if (isSame(mm.sts[i], os[0])) {
indexOfStat = i;
break;
}
}
for (int i = 0; i < mm.eds.length; ++i) {
if (isSame(mm.eds[i], os[1])) {
indexOfEdge = i;
break;
}
}
if (indexOfStat >= 0 && indexOfEdge >= 0) {
for (int i = 0; i < mm.sts.length; ++i) {
if (isSame(mm.sts[i], os[2])) {
destOfStat = i;
break;
}
}
if (destOfStat >= 0) {
mm.stats[indexOfStat][indexOfEdge] = destOfStat;
if (os[3] != null) {
mm.rs[indexOfStat][indexOfEdge] = (Runnable) os[3];
}
}
}
}
sts = null;
eds = null;
er=null;
alst.clear();
return mm;
}
}


//

package lsm;


public class test {


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MachineBuilder mb=new MachineBuilder();

mb.putEdge(new String[]{"a","b","c","d"});
mb.putState(new String[]{"0","1","2","3"});
mb.setError(new Runnable(){


@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("no way");
}});
mb.putAction("0", "a", "1", new Runnable(){


@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("word");
}});
mb.putAction("1", "b", "2", new Runnable(){


@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("hallo");
}});
mb.putAction("2", "c", "1", null);
mb.putAction("1", "d", "3", null);
Machine m=mb.build();
System.out.println(m.getStat());
m.input("a");
System.out.println(m.getStat());
m.input("b");
System.out.println(m.getStat());
m.input("c");
System.out.println(m.getStat());
m.input("c");
System.out.println(m.getStat());
m.input("d");
System.out.println(m.getStat());
}


}


转载于:https://my.oschina.net/jingshishengxu/blog/639004

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值