数据结构从<int>更改为<string> java

时间:2018-05-05 23:10:09

标签: java

这完全使用整数进行拓扑排序,但是我想让它与String类型兼容作为参数。有没有人对如何从这里更改数据结构有任何指导?或者我必须为[add.edge(&#34; a&#34;,&#34; b&#34;);]重写整个事情? 我试图简单地改变类型,但后来我感到困惑,一旦我尝试改变导致错误的东西就变得很糟糕。 我尝试改变一切,这是否合适?当我变得越来越多时,我仍然会遇到错误

 // A Java program to print topological sorting of a graph
// using indegrees
 import java.util.*;

//Class to represent a graph
class Graph
{
int V;// No. of vertices

//An Array of List which contains 
//references to the Adjacency List of 
//each vertex
List <Integer> adj[];
public Graph(int V){//constructor
    this.V = V;
    adj = new ArrayList[V];
    for(int i = 0; i < V; i++)
        adj[i]=new ArrayList<Integer>();
}   
// function to add an tasks to tree
public void addEdge(int u,int v){
    adj[u].add(v);
}
// prints a Topological Sort of the complete graph  
public void topologicalSort(){
    // Create a array to store indegrees of all
    // vertices. Initialize all indegrees as 0.
    int indegree[] = new int[V];

    // Traverse adjacency lists to fill indegrees of
    // vertices. This step takes O(V+E) time        
    for(int i = 0; i < V; i++){
        ArrayList<Integer> temp = (ArrayList<Integer>) adj[i];
        for(int node : temp){
            indegree[node]++;
        }
    }

    // Create a queue and enqueue all vertices with
    // indegree 0
    Queue<Integer> q = new LinkedList<Integer>();
    for(int i = 0;i < V; i++){
        if(indegree[i]==0)
            q.add(i);
    }    
    // Initialize count of visited vertices
    int cnt = 0;
    // Create a vector to store result (A topological
    // ordering of the vertices)
    Vector <Integer> topOrder=new Vector<Integer>();
    while(!q.isEmpty()){
        // Extract front of queue (or perform dequeue)
        // and add it to topological order
        int u=q.poll();
        topOrder.add(u);
        // Iterate through all its neighbouring nodes
        // of dequeued node u and decrease their in-degree
        // by 1
        for(int node : adj[u]){
            // If in-degree becomes zero, add it to queue
            if(--indegree[node] == 0)
                q.add(node);
        }
        cnt++;
    }  
    // Check if there was a cycle       
    if(cnt != V){
        System.out.println("There exists a cycle in the graph");
        return ;
    }//else{System.out.println("no cycle in the graph");}
    // Print topological order          
    for(int i : topOrder){
        System.out.print(i+" ");
    }
}
}
// Driver program to test above functions
class Main
{
public static void main(String args[])
{
    Graph g=new Graph(8);//must be max number of letters+1
    g.addEdge(1, 4);
    g.addEdge(2, 5);
    g.addEdge(7, 5);
    g.addEdge(5, 4);
    g.addEdge(3, 4);
    g.addEdge(4, 6);
    g.addEdge(2, 4);
    System.out.println("Following is a Topological Sort");
    g.topologicalSort();
}
}

1 个答案:

答案 0 :(得分:3)

最简单的解决方案是在类的定义中使用泛型。然后用户可以定义他们是否需要字符串或整数(或其他任何东西):

Graph<String> stringGraph = new Graph<>();
stringGraph.addEdge("foo", "bar");

Graph<Integer> intGraph = new Graph<>();
intGraph.addEdge(5, 7);

Graph<Vertex> vertexGraph = new Graph<>();
Vertex v1 = new Vertex(...);
Vertex v2 = new Vertex(...);
vertexGraph.addEdge(v1, v2);