Декодирование входного слова с помощью взвешенного направленного графа(Автомат Мура)

[![Направленный взвешенный граф,где в качестве веса исполюзуются строки 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);
}
}

` автомат]2]2

введите сюда код

Ответы (0 шт):