/*
 *  ======================================================================
 *  Compilation:  javac SymbolTable.java
 *  Execution:    java SymbolTable
 *  
 *  Symbol table implementation using Java's HashMap library.
 *  If you add a key-value pair and the key is already present,
 *  the new key-value pair replaces the old one.
 *  ======================================================================
 */

import java.util.HashMap;
import java.util.Set;
import java.util.Iterator;
import java.util.Map;

public class SymbolTable {

    private HashMap st = new HashMap();

    public void put(String key, Object value) { st.put(key, value);   }
    public Object get(String key)             { return st.get(key);   }
    public String toString()                  { return st.toString(); }

    // Return an array contains all of the keys

    public String[] keys() {
        Set keyvalues = st.entrySet();
        String[] keys = new String[st.size()];
        Iterator it = keyvalues.iterator();
        for (int i = 0; i < st.size(); i++) {
            Map.Entry entry = (Map.Entry) it.next();
            keys[i] = (String) entry.getKey();
        }
        return keys;
    }


   /***********************************************************************
    * Test routine.
    **********************************************************************/

    public static void main(String[] args) {

        SymbolTable st = new SymbolTable();

        // Create metro stations ....

        MetroStation gA = new MetroStation(   "Greenbelt", 100.0, 100.0 );
        gA.setParking( true );
        MetroStation gB = new MetroStation("College Park", 100.0,  80.0 );
        gB.setParking( true );
        MetroStation gC = new MetroStation( "Silver Spring", 70.0,  90.0 );
        gC.setParking( true );
        MetroStation gD = new MetroStation(   "Fort Totten",  70.0,  70.0 );
        gD.setParking( false );
        MetroStation gE = new MetroStation(  "Union Station", 50.0,  50.0 );
        gE.setParking( false );
        MetroStation gF = new MetroStation(  "DuPont Circle", 20.0,  60.0 );
        gF.setParking( false );
        MetroStation gG = new MetroStation( "Catholic University", 60.0,  60.0 );
        gG.setParking( false );

        // Insert some (key, value pairs)

        st.put(           "Greenbelt",  gA );
        st.put(        "College Park",  gB );
        st.put(       "Silver Spring",  gC );
        st.put(         "Fort Totten",  gD );
        st.put(       "Union Station",  gE );
        st.put(       "DuPont Circle",  gF );
        st.put( "Catholic University",  gG );

        // Define stations along the green and red lines ....

        String redLine[] = {    "Silver Spring",    "Fort Totten",
                          "Catholic University",  "Union Station",
                                "DuPont Circle" };
        String greenLine[] = {      "Greenbelt",   "College Park",
                                  "Fort Totten" };

        // Add track assignments to Metro Station Descriptions ....

        for ( int i = 0; i < redLine.length; i = i + 1 ) {
              MetroStation m = (MetroStation) st.get( redLine[i] );
              m.add("Red");
        }

        for ( int j = 0; j < greenLine.length; j = j + 1 ) {
              MetroStation m = (MetroStation) st.get( greenLine[j] );
              m.add("Green");
        }

        // Ride along track and retrieve station information.

        System.out.println( st.get(     "Greenbelt").toString() );
        System.out.println( st.get(  "College Park").toString() );
        System.out.println( st.get(   "Fort Totten").toString() );
        System.out.println( st.get( "DuPont Circle").toString() );
    }
}