有限状态自动机
表示数值的字符串
状态定义表
状态标号 | 状态信息 |
---|---|
0 | 空格 |
1 | 符号位 |
2 | 整数 |
3 | dot前有数的dot |
4 | dot前没有数的dot |
5 | 整数 |
6 | e |
7 | 符号位 |
8 | 整数 |
9 | 空格 |
初始状态:0、1、2、4
接受状态:2、3、5、8、9
转换条件表
表示 | 缩写 | 含义 | 字符 |
---|---|---|---|
blank | ' ' | 空格 | ' ' |
sign | s | 符号 | '+', '-' |
dot | . | 小数点 | '.' |
digit | d | 整数 | 0-9 |
e | e | e | 'e' |
public boolean isNumber(String s) {
HashMap[] states = {
new HashMap<Character, Integer>() {{
put(' ', 0);
put('s', 1);
put('d', 2);
put('.', 4);
}}, //0.
new HashMap<Character, Integer>() {{
put('d', 2);
put('.', 4);
}}, //1.
new HashMap<Character, Integer>() {{
put('d', 2);
put('.', 3);
put('e', 6);
put(' ', 9);
}}, //2.
new HashMap<Character, Integer>() {{
put('d', 5);
put('e', 6);
put(' ', 9);
}}, //3.
new HashMap<Character, Integer>() {{
put('d', 5);
}}, //4.
new HashMap<Character, Integer>() {{
put('d', 5);
put('e', 6);
put(' ', 9);
}}, //5.
new HashMap<Character, Integer>() {{
put('d', 8);
put('s', 7);
}}, //6.
new HashMap<Character, Integer>() {{
put('d', 8);
}}, //7.
new HashMap<Character, Integer>() {{
put('d', 8);
put(' ', 9);
}}, //8.
new HashMap<Character, Integer>() {{
put(' ', 9);
}} //9.
};
int state = 0; //初始状态
char turn; //转变条件
for (char c : s.toCharArray()) {
if (c >= '0' && c <= '9') turn = 'd';
else if (c == '+' || c == '-') turn = 's';
else if (c == 'e' || c == 'E') turn = 'e';
else if (c == '.' || c == ' ') turn = c;
else turn = '?'; //不存在的转变条件,直接false
if (!states[state].containsKey(turn)) return false;
state = (int) states[state].get(turn);
}
//接受状态
return state == 2 || state == 3 || state == 5 || state == 8 || state == 9;
}
Comments | 0 条评论