0

私はクラス階層を持っています、

Class b extends class a 
Class c extends class a

3 つのクラスはすべてインスタンス化できます。これら 3 つのタイプのオブジェクトが に追加されるようになりましたSet

このセットをトラバースして型 c のインスタンスを見つけ、それに対して何らかの処理を行う必要があります。

現在、セットをトラバースし、各エントリがインスタンスの c かどうかを確認しています。

これを行うより良い方法はありますか?Collections図書館自体に何か?

4

5 に答える 5

1

必要に応じて、挿入された各オブジェクトのクラスにインデックスを付けることができますが、主に 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;
  }
}
于 2013-06-20T13:26:59.120 に答える
1

目的の動作を正確に指定していません。から派生cしたクラスのインスタンスではなく、 の正確なインスタンスのみが必要なようですc

その場合は、次を使用しますObject.getClass

x.getClass().equals(c.class);

これは が のインスタンスである場合に true になりxますが、 が から派生したクラスのインスタンスである場合は trueでcはありませんxc

そうでない場合は、次を使用しますinstanceof

x instanceof c

これはx、 が のインスタンスである場合に真となり、 が から派生したクラスのインスタンスである場合c真になります。xc

どちらを選んでも、そこからイテレータを使用します。

Iterator<a> iter = set.iterator();
while(iter.hasNext()) {
    a item = iter.next()
    if(item[.getClass().equals(c.class)| instanceof c]) {
        // do something with item
    }
}

もちろん、これは一般的なパターンであり、このロジックをカプセル化するライブラリがあります。

于 2013-06-20T13:08:04.740 に答える
1

を使用しSetMultimap<Class<?>, A>て具象クラスからそのクラスのインスタンスのセットにマップし、元のセットcontainsValueのメソッドに対応するメソッドを保持できcontainsます。

于 2013-06-20T13:31:21.313 に答える