/** * Initializes a digraph from a file using the specified delimiter. * Each line in the file contains * the name of a vertex, followed by a list of the names * of the vertices adjacent to that vertex, separated by the delimiter. * @param filename the name of the file * @param delimiter the delimiter between fields */ public SymbolDigraph(String filename, String delimiter) { st = new ST<String, Integer>(); // First pass builds the index by reading strings to associate // distinct strings with an index In in = new In(filename); while (in.hasNextLine()) { String[] a = in.readLine().split(delimiter); for (int i = 0; i < a.length; i++) { if (!st.contains(a[i])) st.put(a[i], st.size()); } } // inverted index to get string keys in an aray keys = new String[st.size()]; for (String name : st.keys()) { keys[st.get(name)] = name; } // second pass builds the digraph by connecting first vertex on each // line to all others G = new Digraph(st.size()); in = new In(filename); while (in.hasNextLine()) { String[] a = in.readLine().split(delimiter); int v = st.get(a[0]); for (int i = 1; i < a.length; i++) { int w = st.get(a[i]); G.addEdge(v, w); } } }