6

私はSet高価な物を持っています。

これらのオブジェクトにはIDがあり、equalsこれらのIDを使用して同等になります。

これらのオブジェクトの型には2つのコンストラクターがあります。1つは高価なオブジェクト用で、もう1つはIDを設定するだけです。

したがって、特定のIDがSetusingにあるかどうかを確認できSet.contains(new Object(ID))ます。

ただし、オブジェクトがセット内にあると判断したため、セット内のオブジェクトインスタンスを取得できません。

セットに含まれる正確なオブジェクトを取得するにはどうすればよいですか?

4

5 に答える 5

5

EclipseコレクションUnifiedSetでクラスを使用することを検討してください。に加えてインターフェースを実装します。putおよびget用の-likeAPIを追加します。値用にメモリを予約せず、キーのみを予約するため、メモリ効率が高くなります。PoolSetPoolMapPoolMap

UnifiedSet<Integer> pool = UnifiedSet.newSet();

Integer integer = 1;
pool.add(integer);

Assert.assertSame(integer, pool.get(new Integer(integer)));

注:私はEclipseコレクションのコミッターです。

于 2012-10-01T20:19:00.400 に答える
4

コレクションから取得する場合getは、マップを使用する必要があります。

(ほとんどの Set 実装は Map のラッパーであることに注意してください)

Map<Key, Value> map = new ....

Value value = map.get(new Key(ID));

あなたの場合、キーと値は同じ型にすることができますが、セットの要素のようにキーは不変でなければならないので、それは一般的に悪い考えです。

于 2012-10-01T09:06:41.763 に答える
2

HashMapID をキーとして使用しても機能しない場合は、キーと値の両方としてオブジェクトで a を使用しHashMapます。

于 2012-10-01T09:06:35.583 に答える
1

欲しいものを手に入れるためのハックを 1 つ紹介します。基本的に、contains を使用してハッシュセット内を検索する場合、ハッシュ コードが一致すると、探しているオブジェクトの equals メソッドが呼び出されます。独自のオブジェクト、または拡張できるオブジェクトを扱っていると仮定すると、「ビーコン信号」を設定するのは簡単です;) 等式化された参照を持つクラスの静的フィールド。これで、contains を呼び出すことができ、true が返された場合はオブジェクトを取得できます ;)

PS 私を判断しないでください

import java.util.HashSet;
import java.util.Set;

public class BecauseWhyNot {

    public static void main(String[] args) {

        Set<Poop> sewage = new HashSet<Poop>();

        set.add(new Poop("Morning Delight"));
        set.add(new Poop("Hangover Doodle"));

        System.out.println("Contains Fire Drill?: "
            + set.contains(new Poop("Fire Drill")));
        System.out.println("Contains Morning Delight?: "
            + set.contains(new Poop("Morning Delight")));

        if (Poop.lastlySmelled != null)
            System.out.println("It's you lucky day: " + Poop.lastlySmelled);
        else
            System.out.println("Sorry, try again ;)");
    }

    public static class Poop {
        static Poop lastlySmelled = null;

        String description;

        Poop(String desc) {
            description = desc;
        }

        @Override
        public int hashCode() {
            return 900913 * description.hashCode();
        }

        @Override
        public boolean equals(Object obj) {
            lastlySmelled = (Poop) this;
            if (this == obj)            return true;
            if (obj == null)            return false;
            if (getClass() != obj.getClass())   return false;
            Poop other = (Poop) obj;
            if (description == null) {
                if (other.description != null)
                    return false;
            } else if (!description.equals(other.description))
                return false;
            return true;
        }

        public String toString() {
            return "Poop: " + description + "!";
        }
    }
于 2014-04-07T02:15:21.040 に答える
0

Apache Commons CollectionsのFilterIteratorを使用できます。

Predicate eq = new EqualPredicate(new Object(ID));
FilterIterator filter = new FilterIterator(set.iterator(), eq);
Object o = (Object) filter.next();

明らかに、これはそれにアクセスするための高価な方法になりますが、 を使用するSetことに固執している場合は、ある時点でそれを繰り返す必要があります。

于 2012-10-01T09:07:56.677 に答える