0

特定のインターフェイスを実装するオブジェクトのコレクションを探していますが、コレクション内の具象型ごとに 1 つのみにしたいと考えています。

collection of implementers of dog:
 - instance of dachshund
 - instance of beagle
 - instance of corgi

.NET には、「KeyedByTypeCollection」があります。Androidで使用できるような方法でJavaに同様のものが存在しますか?

ありがとう!

4

4 に答える 4

2

サードパーティのライブラリを使用する意思がある場合、および順序を維持することを気にしない場合は、ここでGuava が ClassToInstanceMap適用できるようです。

ClassToInstanceMap<Dog> map = MutableClassToInstanceMap.create();
map.putInstance(Corgi.class, new Corgi("Spot"));
map.putInstance(Beagle.class, new Beagle("Lady"));
Corgi corgi = map.getInstance(Corgi.class); // no cast required

(開示:私はGuavaに貢献しています。)

于 2012-06-26T14:28:22.910 に答える
1

ジェネリックを見るべきです。例えば: List<Dogs> dogList = new ArrayList<Dogs>();

編集:コレクションに一意のインスタンスのみを含めるには、使用する必要がありますSet<Dogs> dogList = new HashSet<Dogs>();

于 2012-06-26T13:45:22.077 に答える
0

これはあなたが探しているものかもしれません: コード内のコメントを参照してください

// two Dog(interface) implementations
        // Beagle, Dachshund implements Interface Dog.
        final Dog d1 = new Beagle();
        final Dog d2 = new Dachshund();

        // here is your collection with type <Dog>
        final Set<Dog> set = new HashSet<Dog>();
        set.add(d1);
        set.add(d2);

        // see output here
        for (final Dog d : set) {
            System.out.println(d.getClass());
        }

        // you can fill them into a map
        final Map<Class, Dog> dogMap = new HashMap<Class, Dog>();
        for (final Dog d : set) {
            // dog instances with same class would be overwritten, so that only one instance per type(class)
            dogMap.put(d.getClass(), d); 
        }

system.out.println 行の出力は次のようになります。

class test.Beagle
class test.Dachshund
于 2012-06-26T13:54:28.627 に答える
0

同じキーで複数の値を維持するカスタム HaspMap が必要だと思います。

そこで、HashMap を拡張して値を入れる単純なクラスを作成します。

public class MyHashMap extends LinkedHashMap<String, List<String>> {

    public void put(String key, String value) {
        List<String> current = get(key);
        if (current == null) {
            current = new ArrayList<String>();
            super.put(key, current);
        }
        current.add(value);
    }
}

次に、MyHashMap のインスタンスを作成し、以下のように値を入れます。

        MyHashMap hashMap = new MyHashMap();
        hashMap.put("dog", "dachshund");
        hashMap.put("dog", "beagle");
        hashMap.put("dog", "corgi");
        Log.d("output", String.valueOf(hashMap));

出力

{dog=[dachshund, beagle, corgi]}
于 2012-06-26T13:45:54.083 に答える