2009-02-26 10 views
0

私はMyClassを持っています。これは2つの整数を格納していて、はmyVectorです。Java:ベクトルからのカスタムオブジェクトの削除

は今、私はこれを行う:

... 
myVector.add(new MyClass(1,1)); 
for(MyClass m : myVector) 
    System.out.println(m); 
System.out.println(myVector.size()); 

myVector.remove(new MyClass(1,1)); 
for(MyClass m : myVector) 
    System.out.println(m); 
System.out.println(myVector.size()); 
... 

ここでの問題は、私はベクトルとそのサイズを印刷するとき、私が見るように、オブジェクトが、削除されていないことです。どうすればそれを修正できますか?

編集:私はそれがオブジェクトを見つけることができないと私はとテストしたことがわかります。私が必要とするのは、それを価値観と比較することです。もし私が==オペレータを過負荷にすることができたら、私はそれを行うことができましたが、これをどのように修正するのか分かりません。

編集2:いいえ、equals()は私がしたいことをします。しかし、私はhashCodeメソッドに何を入れるべきか分かりません。

編集3:私はcontains()で見つけることができますが、削除すると削除されません。

上記のコードを除いて、削除(新しいMyClassの(1,1)と同じである
int position = myVector.indexOf(new MyClass(1,1)); 
myVector.remove(position); 

が動作していない任意の考えを行います)(削除:

でも、私はそれを削除するためにこれを使用することができます。 ?

+0

私は自由にクラスを大文字にしました。クラスは大文字で始まります。 –

+0

大丈夫、申し訳ありませんが、私は名前が良くありません。 –

+0

PDFを読むhashCode()の情報については、リンク先を参照してください。 –

答えて

0

いくつかのエラーがgrammar31's answer;であり、ここではそれらを修正:

@Override 
public boolean equals(Object o) { 
    if ((o == null) || (o.getClass() != myClass.class)) { 
    return false; 
    } 
    myClass other = (myClass) o; 
    return (other.a == this.a) && (other.b == this.b); 
} 

@Override 
public int hashCode() { 
    return a * 31 + b; 
} 

これはmyClassintメンバーabを持っている前提としています。

1

あなたはそれが最初のものと同じ値を含んでいても、異なるMyClassのを削除しようとしている。

あなたがそれらが等しいと考えることにしたい場合は、にMyClassのためのequalsメソッドをオーバーライドする必要があります値が等しいことを確認してください。

+0

ともちろんhashcodeメソッドです。 Eclipseにはまともな自動生成機能があります。 – JeeBee

0

これらの2つのオブジェクトを考慮するには、.equals()を実装する必要があります。しかし、.equals().hashCode()の契約では、.equals()を実装するたびに.hashCode()を実装する必要があることが基本的にわかります。

Chapter 3 of Effective Java詳細をお知らせします。

2

次の2つの選択肢があります。

:あなたはあなたのコードを追加した同じインスタンスを削除するように変更

を追加

  • が同じオブジェクトのインスタンスを削除MyClassのためequals()を実装する、または
  • MyClass myClass = new myClass(1,1); 
    myVector.add(myClass); 
    for(myClass m : myVector) 
        System.out.println(m); 
    System.out.println(myVector.size()); 
    
    myVector.remove(myClass); 
    for(myClass m : myVector) 
        System.out.println(m); 
    System.out.println(myVector.size()); 
    

    他の人がサンプルのimpl equals()のためのementation - しかし、あなたが望むものを決定する必要がありますか?それは非常によいかもしれません。上記の2つの選択肢のどれがこのオブジェクトに適しているかを選択します。

    equals()を実装した場合、で、hashCode()を実装する必要があります。 Eclipseには右クリックオプションがあり、equals()hashCode()の両方を実装できます。私はコードの問題を誰かがequals()しか実装していないことを見てきましたが、これは理論上の問題のようですが、実際はそうではありません。