Как написать метод toString для взвешенного неориентированного графа в Java? - PullRequest
0 голосов
/ 10 октября 2018

Я написал класс для неориентированных графов и таблицу символов для преобразования ребер из строк в числа и наоборот, но двухстрочный метод не работает, так как я получаю ошибку переполнения стека.я реализовал LinkedStack, который является таким же, как стек в библиотеке Java.Я не получаю ошибку компиляции, и я был бы признателен, если бы я мог взглянуть на метод toString.другие методы работают нормально.Вот код ниже.Я думаю, что проблема в том, когда я вызываю итератор

public class EdgeWeightedGraph {
private final int V;
private int E;
private LinkedStack<Edge>[] adj;

public EdgeWeightedGraph(int V){
    this.V = V;
    this.E = 0;
    adj = new LinkedStack[V];
    for (int v = 0; v < V; v++)
    {
        adj[v] = new LinkedStack<Edge>();
    }
}

public int V(){
    return V(); // This was the error. thank you for spotting it :)
}

public int E(){
    return E;
}

public int degree(int v){
    return adj[v].size();
}

public void addEdge(Edge e){
    int v = e.either();
    int w = e.other(v);
    adj[v].push(e);
    adj[w].push(e);
    E++;
}

public Iterable<Edge> adj(int v){
    return adj[v];
}

public Iterable<Edge> edges(){
    LinkedStack<Edge> b = new LinkedStack<Edge>();
    for(int v = 0; v < V; v++)
    {
        for(Edge e: adj[v])
        {
            if(e.other(v) > v)
                b.push(e);
        }
    }
    return b;
}
}

, как для другого класса, который содержит toString ()

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class EdgeSymbolGraph {
private ST<String, Integer> st;
private String[] keys;
private EdgeWeightedGraph G;

public EdgeSymbolGraph(File stream){
    st = new ST<String, Integer>();
    try 
    {
        Scanner in = new Scanner(stream);
        while(in.hasNextLine())
        {
            String v1 = in.next();
            String v2 = in.next();
            if(!st.contains(v1))
                st.put(v1, st.size());
            if(!st.contains(v2))
                st.put(v2, st.size());
        }

        keys = new String[st.size()];

        for(String name: st.keys())
            keys[st.get(name)] = name;

        G = new EdgeWeightedGraph(st.size());
        Scanner m = new Scanner(stream);
        for(int i = 0; m.hasNextLine(); i++)
        {
            int v1 = st.get(m.next());
            int v2 = st.get(m.next());
            Edge e = new Edge(v1, v2, i);
            G.addEdge(e);
        }
    } 

    catch (FileNotFoundException e) 
    {
        e.printStackTrace();
    }
}

public EdgeWeightedGraph getGraph(){
    return G;
}

public String name(int v){
    return keys[v];
}

public int index(String s){
    return st.get(s);
}

public String toString(){ //this the method that needs fixing
    StringBuilder s = new StringBuilder();
    s.append(G.V() + " " + G.E() + "\n");
    for (int v = 0; v < G.V(); v++)
    {
        s.append(name(v) + " : ");
        for (Edge e: G.adj(v)) // I think this is the problem when i call iterator
        {
            s.append(e.toString() + " ");
        }
        s.append("\n");
    }
    return s.toString();
}
}

1 Ответ

0 голосов
/ 10 октября 2018

Ваше определение метода V () является рекурсивным и, вероятно, входит в бесконечный цикл.Вы, вероятно, хотите, чтобы это было:

public int V(){
    return V;
}
...