package org.hyperic.util; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public abstract class Classifier<A,Y,Z> { public Map<Y,Z> classifyUnique(Collection<A> c) { if (c == null || c.isEmpty()) { return Collections.emptyMap(); } final Map<Y,Z> rtn = new HashMap<Y,Z>(); for (final A o : c) { if (o == null) { continue; } final NameValue<Y,Z> nv= classify(o); if (nv == null) { continue; } rtn.put(nv.key, nv.val); } return rtn; } public Map<Y,Set<Z>> classifyUniqueValues(Collection<A> c) { if (c == null || c.isEmpty()) { return Collections.emptyMap(); } final Map<Y, Set<Z>> rtn = new HashMap<Y, Set<Z>>(); for (final A o : c) { if (o == null) { continue; } final NameValue<Y,Z> nv = classify(o); if (nv == null) { continue; } Set<Z> tmp; if (null == (tmp = rtn.get(nv.key))) { tmp = new HashSet<Z>(); rtn.put(nv.key, tmp); } tmp.add(nv.val); } return rtn; } public Map<Y,Collection<Z>> classify(Collection<A> c) { if (c == null || c.isEmpty()) { return Collections.emptyMap(); } final Map<Y, Collection<Z>> rtn = new HashMap<Y, Collection<Z>>(); for (final A o : c) { if (o == null) { continue; } final NameValue<Y,Z> nv = classify(o); if (nv == null) { continue; } Collection<Z> tmp; if (null == (tmp = rtn.get(nv.key))) { tmp = new ArrayList<Z>(); rtn.put(nv.key, tmp); } tmp.add(nv.val); } return rtn; } public abstract NameValue<Y,Z> classify(A key); public class NameValue<Y,Z> { private final Y key; private final Z val; public NameValue(Y key, Z val) { this.key = key; this.val = val; } } }