Automata indentation and link (#1425)
* finite automata example * indentation and link
This commit is contained in:
parent
9d0cb1e2aa
commit
202a19acbf
@ -3,3 +3,4 @@
|
|||||||
- [Dijkstra Algorithm in Java](http://www.baeldung.com/java-dijkstra)
|
- [Dijkstra Algorithm in Java](http://www.baeldung.com/java-dijkstra)
|
||||||
- [Introduction to Cobertura](http://www.baeldung.com/cobertura)
|
- [Introduction to Cobertura](http://www.baeldung.com/cobertura)
|
||||||
- [Ant Colony Optimization](http://www.baeldung.com/java-ant-colony-optimization)
|
- [Ant Colony Optimization](http://www.baeldung.com/java-ant-colony-optimization)
|
||||||
|
- [Validating Input With Finite Automata in Java](http://www.baeldung.com/finite-automata-java)
|
||||||
|
@ -5,12 +5,12 @@ package com.baeldung.automata;
|
|||||||
*/
|
*/
|
||||||
public interface FiniteStateMachine {
|
public interface FiniteStateMachine {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Follow a transition, switch the state of the machine.
|
* Follow a transition, switch the state of the machine.
|
||||||
* @param c Char.
|
* @param c Char.
|
||||||
* @return A new finite state machine with the new state.
|
* @return A new finite state machine with the new state.
|
||||||
*/
|
*/
|
||||||
FiniteStateMachine switchState(final CharSequence c);
|
FiniteStateMachine switchState(final CharSequence c);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is the current state a final one?
|
* Is the current state a final one?
|
||||||
|
@ -6,25 +6,25 @@ package com.baeldung.automata;
|
|||||||
*/
|
*/
|
||||||
public final class RtFiniteStateMachine implements FiniteStateMachine {
|
public final class RtFiniteStateMachine implements FiniteStateMachine {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Current state.
|
* Current state.
|
||||||
*/
|
*/
|
||||||
private State current;
|
private State current;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ctor.
|
* Ctor.
|
||||||
* @param initial Initial state of this machine.
|
* @param initial Initial state of this machine.
|
||||||
*/
|
*/
|
||||||
public RtFiniteStateMachine(final State initial) {
|
public RtFiniteStateMachine(final State initial) {
|
||||||
this.current = initial;
|
this.current = initial;
|
||||||
}
|
}
|
||||||
|
|
||||||
public FiniteStateMachine switchState(final CharSequence c) {
|
public FiniteStateMachine switchState(final CharSequence c) {
|
||||||
return new RtFiniteStateMachine(this.current.transit(c));
|
return new RtFiniteStateMachine(this.current.transit(c));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canStop() {
|
public boolean canStop() {
|
||||||
return this.current.isFinal();
|
return this.current.isFinal();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -33,10 +33,10 @@ public final class RtState implements State {
|
|||||||
return this.isFinal;
|
return this.isFinal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public State with(Transition tr) {
|
public State with(Transition tr) {
|
||||||
this.transitions.add(tr);
|
this.transitions.add(tr);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,26 +6,26 @@ package com.baeldung.automata;
|
|||||||
*/
|
*/
|
||||||
public final class RtTransition implements Transition {
|
public final class RtTransition implements Transition {
|
||||||
|
|
||||||
private String rule;
|
private String rule;
|
||||||
private State next;
|
private State next;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ctor.
|
* Ctor.
|
||||||
* @param rule Rule that a character has to meet
|
* @param rule Rule that a character has to meet
|
||||||
* in order to get to the next state.
|
* in order to get to the next state.
|
||||||
* @param next Next state.
|
* @param next Next state.
|
||||||
*/
|
*/
|
||||||
public RtTransition (String rule, State next) {
|
public RtTransition (String rule, State next) {
|
||||||
this.rule = rule;
|
this.rule = rule;
|
||||||
this.next = next;
|
this.next = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
public State state() {
|
public State state() {
|
||||||
return this.next;
|
return this.next;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPossible(CharSequence c) {
|
public boolean isPossible(CharSequence c) {
|
||||||
return this.rule.equalsIgnoreCase(String.valueOf(c));
|
return this.rule.equalsIgnoreCase(String.valueOf(c));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,12 +5,12 @@ package com.baeldung.automata;
|
|||||||
*/
|
*/
|
||||||
public interface State {
|
public interface State {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a Transition to this state.
|
* Add a Transition to this state.
|
||||||
* @param tr Given transition.
|
* @param tr Given transition.
|
||||||
* @return Modified State.
|
* @return Modified State.
|
||||||
*/
|
*/
|
||||||
State with(final Transition tr);
|
State with(final Transition tr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Follow one of the transitions, to get
|
* Follow one of the transitions, to get
|
||||||
|
@ -5,16 +5,16 @@ package com.baeldung.automata;
|
|||||||
*/
|
*/
|
||||||
public interface Transition {
|
public interface Transition {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is the transition possible with the given character?
|
* Is the transition possible with the given character?
|
||||||
* @param c char.
|
* @param c char.
|
||||||
* @return true or false.
|
* @return true or false.
|
||||||
*/
|
*/
|
||||||
boolean isPossible(final CharSequence c);
|
boolean isPossible(final CharSequence c);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The state to which this transition leads.
|
* The state to which this transition leads.
|
||||||
* @return State.
|
* @return State.
|
||||||
*/
|
*/
|
||||||
State state();
|
State state();
|
||||||
}
|
}
|
||||||
|
@ -9,74 +9,74 @@ import com.baeldung.automata.*;
|
|||||||
*/
|
*/
|
||||||
public final class RtFiniteStateMachineTest {
|
public final class RtFiniteStateMachineTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void acceptsSimplePair() {
|
public void acceptsSimplePair() {
|
||||||
String json = "{\"key\":\"value\"}";
|
String json = "{\"key\":\"value\"}";
|
||||||
FiniteStateMachine machine = this.buildJsonStateMachine();
|
FiniteStateMachine machine = this.buildJsonStateMachine();
|
||||||
for (int i=0;i<json.length();i++) {
|
for (int i=0;i<json.length();i++) {
|
||||||
machine = machine.switchState(String.valueOf(json.charAt(i)));
|
machine = machine.switchState(String.valueOf(json.charAt(i)));
|
||||||
}
|
}
|
||||||
assertTrue(machine.canStop());
|
assertTrue(machine.canStop());
|
||||||
}
|
}
|
||||||
@Test
|
@Test
|
||||||
public void acceptsMorePairs() {
|
public void acceptsMorePairs() {
|
||||||
String json = "{\"key1\":\"value1\",\"key2\":\"value2\"}";
|
String json = "{\"key1\":\"value1\",\"key2\":\"value2\"}";
|
||||||
FiniteStateMachine machine = this.buildJsonStateMachine();
|
FiniteStateMachine machine = this.buildJsonStateMachine();
|
||||||
for (int i=0;i<json.length();i++) {
|
for (int i=0;i<json.length();i++) {
|
||||||
machine = machine.switchState(String.valueOf(json.charAt(i)));
|
machine = machine.switchState(String.valueOf(json.charAt(i)));
|
||||||
}
|
}
|
||||||
assertTrue(machine.canStop());
|
assertTrue(machine.canStop());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
@Test(expected = IllegalArgumentException.class)
|
||||||
public void missingColon() {
|
public void missingColon() {
|
||||||
String json = "{\"key\"\"value\"}";
|
String json = "{\"key\"\"value\"}";
|
||||||
FiniteStateMachine machine = this.buildJsonStateMachine();
|
FiniteStateMachine machine = this.buildJsonStateMachine();
|
||||||
for (int i=0;i<json.length();i++) {
|
for (int i=0;i<json.length();i++) {
|
||||||
machine = machine.switchState(String.valueOf(json.charAt(i)));
|
machine = machine.switchState(String.valueOf(json.charAt(i)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builds a finite state machine to validate a simple
|
* Builds a finite state machine to validate a simple
|
||||||
* Json object.
|
* Json object.
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private FiniteStateMachine buildJsonStateMachine() {
|
private FiniteStateMachine buildJsonStateMachine() {
|
||||||
State first = new RtState();
|
State first = new RtState();
|
||||||
State second = new RtState();
|
State second = new RtState();
|
||||||
State third = new RtState();
|
State third = new RtState();
|
||||||
State fourth = new RtState();
|
State fourth = new RtState();
|
||||||
State fifth = new RtState();
|
State fifth = new RtState();
|
||||||
State sixth = new RtState();
|
State sixth = new RtState();
|
||||||
State seventh = new RtState();
|
State seventh = new RtState();
|
||||||
State eighth = new RtState(true);
|
State eighth = new RtState(true);
|
||||||
|
|
||||||
first.with(new RtTransition("{", second));
|
first.with(new RtTransition("{", second));
|
||||||
second.with(new RtTransition("\"", third));
|
second.with(new RtTransition("\"", third));
|
||||||
//Add transitions with chars 0-9 and a-z
|
//Add transitions with chars 0-9 and a-z
|
||||||
for (int i = 0; i < 26; i++) {
|
for (int i = 0; i < 26; i++) {
|
||||||
if(i<10) {
|
if(i<10) {
|
||||||
third = third.with(
|
third = third.with(
|
||||||
new RtTransition(String.valueOf(i), third)
|
new RtTransition(String.valueOf(i), third)
|
||||||
);
|
|
||||||
sixth = sixth.with(
|
|
||||||
new RtTransition(String.valueOf(i), sixth)
|
|
||||||
);
|
);
|
||||||
}
|
sixth = sixth.with(
|
||||||
third = third.with(
|
new RtTransition(String.valueOf(i), sixth)
|
||||||
new RtTransition(String.valueOf((char) ('a' + i)), third)
|
);
|
||||||
);
|
}
|
||||||
sixth = sixth.with(
|
third = third.with(
|
||||||
new RtTransition(String.valueOf((char) ('a' + i)), sixth)
|
new RtTransition(String.valueOf((char) ('a' + i)), third)
|
||||||
);
|
);
|
||||||
}
|
sixth = sixth.with(
|
||||||
third.with(new RtTransition("\"", fourth));
|
new RtTransition(String.valueOf((char) ('a' + i)), sixth)
|
||||||
fourth.with(new RtTransition(":", fifth));
|
);
|
||||||
fifth.with(new RtTransition("\"", sixth));
|
}
|
||||||
sixth.with(new RtTransition("\"", seventh));
|
third.with(new RtTransition("\"", fourth));
|
||||||
seventh.with(new RtTransition(",", second));
|
fourth.with(new RtTransition(":", fifth));
|
||||||
seventh.with(new RtTransition("}", eighth));
|
fifth.with(new RtTransition("\"", sixth));
|
||||||
return new RtFiniteStateMachine(first);
|
sixth.with(new RtTransition("\"", seventh));
|
||||||
}
|
seventh.with(new RtTransition(",", second));
|
||||||
|
seventh.with(new RtTransition("}", eighth));
|
||||||
|
return new RtFiniteStateMachine(first);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user