user11437597
user11437597

Reputation:

How do I call upon the method in this program?

I'm trying to test out my program to see how it works, but I'm not sure how to call upon it in the main method. I've tried doing Assignment5Solution.findOrder() but it does not work. Any help with this issue would be greatly appreciated. The code is supposed to take the number of classes a student has to take along with the prerequisites for each course if there are any, and put the correct order of what classes the student should take.

package Assignment5;

import java.lang.reflect.Array;
import java.util.*;

/**
 *
 * @author harpe
 */
class Assignment5Solution {

    public int[] findOrder(int numCourses, int[][] prerequisites) {
        int E = prerequisites.length;
        Graph G = new Graph(numCourses);
        for (int i = 0; i < E; i++) {
            G.addEdge(prerequisites[i][1], prerequisites[i][0]);
        } // Graph is constructed

        DFS d = new DFS(G); // depth first search
        return d.reverseDFSorder();
    }

    public class DFS {

        private boolean[] marked;
        private int[] courseOrder; // i.e., reverse post order
        private boolean hasCycle;
        private int index; // index for the array courseOrder, index 0 is for the course taken first, …
        private HashSet<Integer> callStack; // used to detect if there are cycles on the graph

        DFS(Graph G) {
            marked = new boolean[G.V()];
            courseOrder = new int[G.V()];
            index = courseOrder.length - 1; // index 0 of courseOrder will be course taken first, lastIndex will be taken last

            callStack = new HashSet<Integer>(); // HashSet is a hash table, for O(1) search

            for (int v = 0; v < G.V(); v++) { // to visit each node, including those on islands or isolated
                if (!marked[v] && !hasCycle) {
                    dfs(G, v);
                }
            }
        }

        private void dfs(Graph G, int v) {
            marked[v] = true;
            callStack.add(v); // use HashSet to simulate callStack
            for (int w : G.adj(v)) {
                if (!marked[w]) {
                    dfs(G, w);
                } else if (callStack.contains(w)) // search in HashSet is O(1)
                {
                    hasCycle = true; // this is a cycle!
                    break;
                }
            }
            callStack.remove(v);
            courseOrder[index--] = v; // index starts from array length -1, decrease by 1 each time, and then ends at 0
        }

        public int[] reverseDFSorder() {
            if (hasCycle) {
                return new int[0]; // return an empty int array (with size 0)
            }
            return courseOrder;
        }
    } // end of class DFS

    public class Graph {

        private int V;
        private List[] adj;

        Graph(int V) // constructor
        {
            this.V = V;
            adj = new List[V];
            for (int i = 0; i < V; i++) {
                adj[i] = new ArrayList<Integer>();
            }
        }

        public void addEdge(int v, int w) {
            adj[v].add(w);
        }

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

        public int V() {
            return V;
        }
    } // end of class Graph
} // end of class Solution 

Upvotes: 0

Views: 76

Answers (1)

Nexevis
Nexevis

Reputation: 4667

public int[] findOrder(int numCourses, int[][] prerequisites) {}

would need to be:

public static int[] findOrder(int numCourses, int[][] prerequisites) {}

The static keyword means you do not need to a declare an object of the class to use it. So you can use it using:

Assignment5Solution.findOrder(numCourses, prerequisites) 
//numCourses and prerequisites can be any int and int[][] respectively.

EDIT: Another note too, depending on where your main method is you may need to make class Assignment5Solution a public class with:

public class Assignment5Solution {

It currently is package protected so it will only be able to be used if it is in the same package.

EDIT2:

If you want to use it as a nonstatic method you need to do something like this(change null and 0 to the real values):

    Assignment5Solution test = new Assignment5Solution() {};
    int numCourses = 0;
    int [][] prereqs = null;
    int[] reverseOrder = test.findOrder(numCourses, prereqs);

Upvotes: 1

Related Questions