Декодирование входного слова с помощью взвешенного направленного графа(Автомат Мура)
[![Направленный взвешенный граф,где в качестве веса исполюзуются строки X2/Y1,X2/Y2 и тд.Класс Edge хранит в себе узел(вершину) куда направлено ребро и HashMap<String,String> - отвечает за веса каждого ребра.Класс Node отвечает за вершину(s1,s2,s3,s4) и хранит в себе список ребер с которыми эта вершина связана.Проблема заключается в реализации метода runMealy() класса Graph,так как с помощью рекурсии я хочу обойти граф при этом записать необходимые данные в стек но на выводе стек казывается пустым.Метод runMealy() работает по следующему принципу:приходит входное слово X2X1X1X1X1X1 ,он разбивает это слово по два символа в строку и записывает в массив,затем с вершины S1 начинает двигаться по ребру где вес X1 или X2 совпдают с значениями в массиве если совпадает то переходит в другое состояние куда направленно ребро,записывает значение величины Y2 или Y1 в стек
и таким образом использовать рекурсию до тех пор пока каждая строка массива не будет пройдена, то-есть на выходе я должен получить строку Y2Y1Y2Y2Y1Y2`
package main;
import java.util.HashMap;
public class Edge {
HashMap<String, String>weight;
Node destination;
public Edge(Node destination) {
super();
weight =new HashMap<String, String>();
this.destination=destination;
}
public HashMap<String, String> getWeight() {
return weight;
}
public Edge(HashMap<String, String> weight, Node destination) {
super();
this.weight = weight;
this.destination = destination;
}
public Edge(HashMap<String, String> weight) {
super();
this.weight = weight;
}
public Node getDestination() {
return destination;
}
}
public class Node {
int n;
String name;
LinkedList<Edge>children;
Node(int n, String name){
this.n = n;
this.name = name;
children=new LinkedList<Edge>();
}
public LinkedList<Edge> getChildren() {
return children;
}
public HashMap<String, String> retWeight(Edge edge){
return edge.getWeight();
}
}
public class Graph {
// Each node maps to a list of all his neighbors
private HashMap<Node, LinkedList<Node>> adjacencyMap;
List<List<Node>> adj_list = new ArrayList<>();
private boolean directed;
public Graph(boolean directed) {
this.directed = directed;
adjacencyMap = new HashMap<>();
weightMap=new HashMap<>();
}
public void addEdge2(Node source,Node destination,Edge edge,String xvalue,String yvalue) {
LinkedList<Node>tmp=adjacencyMap.get(source);
if(tmp!=null) {
tmp.remove(destination);
}else tmp=new LinkedList<Node>();
edge.weight.put(xvalue, yvalue);
destination.children.push(edge);
tmp.add(destination);
adjacencyMap.put(source, tmp);
}
public void printEdges() {
for(Node node:adjacencyMap.keySet()) {
System.out.print("The "+node.name+" has an edge towards: ");
if(adjacencyMap.get(node)!=null) {
for (Node neighbour:adjacencyMap.get(node)) {
System.out.print(neighbour.name+" ");
}
System.out.println();
}else {
System.out.println("none");
}
}
}
public void showEdges2() {
for(Node node:adjacencyMap.keySet()) {
System.out.print("The "+node.name+" has an edge towards: ");
if(adjacencyMap.get(node)!=null) {
for (Node neighbour:adjacencyMap.get(node)) {
for(Edge e:neighbour.children)
System.out.print(neighbour.name+" "+neighbour.retWeight(e));
}
System.out.println();
}else {
System.out.println("none");
}
}
}
public Stack<String> runMealy(Node source) {
Node tempNode=source;
String word="X2X1X1X1X1X1";
Stack<String>stack=new Stack<>();
String temp= word;
String[] array=word.split("(?<=\\G.{" + 2 + "})");
for(Node node:adjacencyMap.get(tempNode)) {
for(Edge edge:node.getChildren()) {
for(Map.Entry<String, String>entry:edge.getWeight().entrySet()) {
for (int i = 0; i < array.length; i++) {
if(entry.getKey()==(array[i])) {
stack.push(entry.getValue());
System.out.println(entry.getValue());
tempNode=edge.getDestination();
array=Arrays.copyOfRange(array,i+1,array.length);
runMealy(tempNode);
}
System.out.println(node.name+" "+entry.getKey()+" "+entry.getValue()+" ");
}
}
}
}
return stack;
}
public boolean hasEdge(Node source,Node destination) {
return adjacencyMap.containsKey(source)&&adjacencyMap.get(source)!=null&&adjacencyMap.get(source).contains(destination);
}
}
public class Main {
public static void main(String[] args) {
Graph graph = new Graph(true);
Node s1 = new Node(0, "S1");
Node s2 = new Node(1, "S2");
Node s3 = new Node(2, "S3");
Node s4 = new Node(3, "S4");
Edge edge1=new Edge(s2);
Edge edge2=new Edge(s1);
Edge edge3=new Edge(s4);
Edge edge4=new Edge(s2);
Edge edge5=new Edge(s4);
Edge edge6=new Edge(s4);
Edge edge7=new Edge(s3);
Edge edge8=new Edge(s2);
graph.addEdge2(s1, s2, edge1,"X2","Y2");
graph.addEdge2(s2, s1, edge2,"X1","Y1");
graph.addEdge2(s1, s4,edge3 ,"X1","Y2");
graph.addEdge2(s2, s2, edge4,"X2","Y1");
graph.addEdge2(s3, s4, edge5,"X1","Y3");
graph.addEdge2(s3, s4, edge6,"X2","Y3");
graph.addEdge2(s4, s3, edge7,"X2","Y1");
graph.addEdge2(s4, s2, edge8,"X1","Y2");
Stack<String>stack=graph.runMealy(s4);
}
}
введите сюда код