class Pet { String m_name; public Pet(String name) { m_name = name; } public Pet() { } } class Mutt extends Pet { public Mutt(String name) { super(name); } public Mutt(){} } class Pug extends Pet { public Pug(String name) { super(name); } public Pug(){} } class Manx extends Pet { public Manx(String name) { super(name); } public Manx(){} } abstract class PetCreator { Random rand = new Random(); public abstract List<Class<? extends Pet>> types(); public Pet randomPet() { int n = rand.nextInt(types().size()); try { return types().get(n).newInstance(); } catch(Exception e) { e.printStackTrace(); return null; } } public Pet[] creatArray(int size) { Pet[] rst = new Pet[size]; for (int i = 0; i < size; ++i) rst[i] = randomPet(); return rst; } } class LiteralPetCreator extends PetCreator { static final List<Class<? extends Pet>> types = Arrays.asList(Mutt.class, Pug.class, Manx.class); static final List<Class<? extends Pet>> alltypes = Arrays.asList(Pet.class, Mutt.class, Pug.class, Manx.class); public List<Class<? extends Pet>> types(){ return types; } } class PetCount3 { static class PetCounter extends LinkedHashMap<Class<? extends Pet>, Integer> { public PetCounter () { for( Class<? extends Pet> c: LiteralPetCreator.alltypes ) { put(c, 0); } } public void count(Pet pet) { for ( Map.Entry<Class<? extends Pet>, Integer> pair : entrySet()) { if(pair.getKey().isInstance(pet)) { put(pair.getKey(), pair.getValue() + 1); } } } public String toString() { StringBuilder sb = new StringBuilder("{"); for( Map.Entry<Class<? extends Pet>, Integer> pair : entrySet()) { sb.append(pair.getKey().getSimpleName()); sb.append("="); sb.append(pair.getValue()); sb.append(", "); } sb.delete(sb.length()-2, sb.length()); sb.append("}"); return sb.toString(); } } } public class tt { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub PetCount3.PetCounter cnt = new PetCount3.PetCounter(); for (Pet p : new LiteralPetCreator().creatArray(20)) { System.out.print(p.getClass().getSimpleName() + " "); cnt.count(p); } System.out.println(); System.out.println(cnt); } }
Mutt Pug Mutt Mutt Manx Mutt Mutt Pug Mutt Mutt Mutt Mutt Pug Manx Manx Pug Pug Mutt Manx Mutt
{Pet=20, Mutt=11, Pug=5, Manx=4}