1

エントリのベクトルがあります。各エントリは、このクラスのインスタンスです。

public class Entry implements Comparable<Entry>{

    private String _key;
    private CustomSet _value;

    [...]

    @Override
    public int compareTo(Entry a) {
        return this._key.compareTo(a._key);
    }
}

ベクトルは次のように宣言されます。

Vector<Entry> entries = new Vector<Entry>();

その後、ベクトルが入力されます。次に、特定のキーがベクトルのどこかにあるかどうかを確認したいと思います。だから私はこれを行います:

Entry sample = new Entry(key, new CustomSet());
if (entries.contains(sample)) {
    // do something
}

これはうまくいかないようです。なんで?どうすればそれを機能させることができますか?

PS CustomSetは別のユーザー定義クラスであり、私の観点からは無関係です。

4

2 に答える 2

6

ドキュメントにあるように、要素がコレクションに属しているかどうかを判断するために依存しているのは、クラスのequalsメソッドを再定義する必要があるためです。Entrycontains

このベクトルに指定された要素が含まれている場合はtrueを返します。より正式には、このベクトルに(o == null?e == null:o.equals(e))のような要素eが少なくとも1つ含まれている場合にのみ、trueを返します。

この場合ocontainのメソッドパラメータです。

于 2012-11-03T21:16:25.650 に答える
2

問題は、同じオブジェクトではなく、同じキーを持つ2つの異なるオブジェクトがあることです。

これ:

Entry sample = new Entry(key, new CustomSet());

新しいオブジェクトを作成します。ここで呼び出しentries.add(sample)てから呼び出しentries.contains(sample)ようとすると、実際には同じオブジェクトであるため、trueが返されます。ただし、次のようなものがある場合はそうではありません。

 Entry sample = new Entry(key, new CustomSet());
 Entry sample1 = new Entry(key, new CustomSet());

 entries.add(sample);

 if(entries.contains(sample1)) // It will still return false.

equals解決策には、オブジェクトを区別するためにを使用してメソッドを再定義することが含まkeysれます。したがって、Entryクラスに以下を追加する必要があります。

 public boolean equals(Object o)
 {
       if(o == null || !getClass().equals(o.getClass()))  return false;
       if(o == this)  return true;
         
       Entry p = (Entry) o;
       return this.key.compareTo(p.key) == 0;
}
于 2012-11-03T21:21:39.643 に答える