java多状态机_一个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 alst = new ArrayList();

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());

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值