0

:と。List<Item> items = new ArrayList<>();の両方のサブクラスに2つの異なるアイテムを追加します。ItemPortableItemSceneryItem

public class Item implements Comparable<item> {
    public String id;
    public String desc;

    ...

    public int compareTo(Item o) {
        return getId().compareTo(o.getId());
    }  
}

IDここで、新しいアイテムをリストに追加する前に、重複するアイテムを検出したいと思います。

    PortableItem a = new PortableItem("a");
    SceneryItem b  = new SceneryItem("a");
    items.add(a);
    items.contains(b); 

falseを返します。どうすればその動作を変更できますか?

4

2 に答える 2

4

equalsidで比較するメソッドを追加できます。デフォルトでは、同じインスタンスであるObject場合は別のメソッドと等しくなります。==これはあなたが望むものではありません。

public class Item implements Comparable<Item> {

    public String id;
    public String desc;

    public String getId() {
        return id;
    }

    @Override
    public int compareTo(Item o) {
        return getId().compareTo(o.getId());
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 17 * hash + Objects.hashCode(this.id);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof Item)) {
            return false;
        }
        final Item other = (Item) obj;
        if (!Objects.equals(this.id, other.id)) {
            return false;
        }
        return true;
    }
}

これはとにかくあなたのメソッドとequalsと一致compareToする要件を考えると本当に良い習慣です-それらが同じである場合はtrueを返します。a.equals(b)id

これでequalsメソッドができたのでhashCode()メソッドが必要です。これも、equals要件と一致しています。

equalsスーパークラスのメソッドをオーバーライドするreturn super.equalsと、最後にtoの呼び出しを使用しない限り、これは明らかに機能しないことに注意してください。

現在、メソッドを使用するListcontainsO(n)が保証されます-これは非常に遅いです。O(1)が保証されているSet場所を使用することをお勧めします。contains順序を維持する必要がある場合は、LinkedHashSetまたはそれ以上の方法をTreeSet使用して、compareToアイテムを自動的に注文します。

とにかく1回のO(n)呼び出しで、いつでもList後で物事を変えることができます...

于 2013-03-14T18:51:32.407 に答える
0

IDで比較するには、基本クラスのメソッドequals()とメソッドをオーバーライドする必要があります。並べ替えにのみ使用されます。hashCode()
compareTo()

于 2013-03-14T18:51:13.830 に答える