//: PetCount.java
/**
 * Using instanceof
 */
import java.util.*;

class pet {}
class dog extends pet {}
class pug extends dog {}
class cat extends pet {}
class rodent extends pet {}
class gerbil extends rodent {}
class hamster extends rodent {}

class counter { int i; }

public class PetCount {
  static String[] typenames = {
    "pet", "dog", "pug", "cat",
    "rodent", "gerbil", "hamster",
  };
  public static void main(String args[]) {
    Vector pets = new Vector();
    try {
      Class[] PetTypes = {
        Class.forName("dog"),
        Class.forName("pug"),
        Class.forName("cat"),
        Class.forName("rodent"),
        Class.forName("gerbil"),
        Class.forName("hamster"),
      };
      for(int i = 0; i < 15; i++)
        pets.addElement(
          PetTypes[
            (int)(Math.random() * PetTypes.length)]
            .newInstance()
        );
    } catch(InstantiationException e) {}
      catch(IllegalAccessException e) {}
      catch(ClassNotFoundException e) {}
    Hashtable h = new Hashtable();
    for(int i = 0; i < typenames.length; i++)
      h.put(typenames[i], new counter());
    for(int i = 0; i < pets.size(); i++) {
      Object o = pets.elementAt(i);
      if(o instanceof pet)
        ((counter)h.get("pet")).i++;
      if(o instanceof dog)
        ((counter)h.get("dog")).i++;
      if(o instanceof pug)
        ((counter)h.get("pug")).i++;
      if(o instanceof cat)
        ((counter)h.get("cat")).i++;
      if(o instanceof rodent)
        ((counter)h.get("rodent")).i++;
      if(o instanceof gerbil)
        ((counter)h.get("gerbil")).i++;
      if(o instanceof hamster)
        ((counter)h.get("hamster")).i++;
    }
    System.out.println("pets = ");
    for(int i = 0; i < pets.size(); i++)
      System.out.println(
        pets.elementAt(i).getClass().toString());
    System.out.println("h = ");
    for(int i = 0; i < typenames.length; i++)
      System.out.println(
        typenames[i] + " quantity: " +
        ((counter)h.get(typenames[i])).i
      );
  }
}