必要に応じて、挿入された各オブジェクトのクラスにインデックスを付けることができますが、主に Set 内のアイテムの数と C インスタンスのレートに依存します。
サンプルクラスは次のとおりです。
public class IndexedSet<T> {
private Map<T,T> container = new HashMap<T,T>();
private Map<Class<?>, Map<T,T>> indexByClass = new IdentityHashMap<Class<?>, Map<T,T>>();
public boolean add(T e) {
if (e == null) {
throw new IllegalArgumentException("Can't add null");
}
if (container.containsKey(e)) return false;
container.put(e, e);
Map<T,T> indexEntry = indexByClass.get(e.getClass());
if (indexEntry == null) {
indexEntry = new IdentifyHashMap<T,T>();
indexByClass.put(e.getClass(), indexEntry);
}
indexEntry.put(e,e);
return true;
}
public boolean remove(T e) {
e = container.remove(e);
if (removed == null) return false;
Map<T,T> indexEntry = indexByClass.get(e.getClass());
indexEntry.remove(e);
return true;
}
public Set<T> getAll() {
return Collections.unmodifiableSet(container.keySet());
}
public Set<T> getByClass(Class<?> clazz) {
Map<T,T> indexEntry = indexByClass.get(clazz);
return indexEntry != null ? Collections.unmodifiableSet(indexEntry.keySet()) : null;
}
}