2

リンクされたリストが 2 つあります。

これらのリストの両方に同じオブジェクトがあります。同じオブジェクトとは、オブジェクトの状態は同じですが、別のオブジェクト ポインターによって参照されていることを意味します。

最初のリストから呼び出し.remove(object);て削除することはできますが、2 番目のリストに対して同じことを行っても削除されません (オブジェクト ポインターの参照が異なるため)。

さまざまなリストから同じ状態のオブジェクトを簡単に削除する方法はありますか?

考えてみると、オブジェクトの状態を比較する 2 番目のリストをループすることになると思いますが、よりクリーンな方法を探していました。

4

3 に答える 3

3

オブジェクトの equals メソッドをオーバーライドします。それらが同様の同等の機能を持っている場合は、両方のリストから正しく削除する必要があります。

編集 - 修正のために:

equals メソッドをオーバーライドするときは、常に hashCode メソッドをオーバーライドする必要があります。そうしないと、リストに奇妙な機能が表示されない場合がありますが、HashMap などで同じオブジェクトを使用しようとすると、remove または put が必要なように機能しないことがあります。

于 2010-11-02T15:39:59.767 に答える
0

オブジェクトの状態が同じである場合は、これを反映するために、equalsメソッドとhashCodeメソッドをオーバーライドするのがおそらく正しいでしょう。equalsメソッドに関する限り、オブジェクトが同じである場合は、両方のリストでremoveを呼び出すことができます。

リンクリストが適切に実装されている場合、メモリ内で異なるオブジェクトがポイントされているという事実は、これが機能するのを妨げることはありません。List APIによると、removeメソッドは次のとおりです。

...(o == null?get(i)== null:o.equals(get(i)))(そのような要素が存在する場合)のように、インデックスiが最も低い要素を削除します。

于 2010-11-02T15:46:46.937 に答える
0

equals()オブジェクトの と の両方をオーバーライドする必要がありますhashCode()。これらがオーバーライドされていない場合、デフォルトの動作はオブジェクトの同一性、つまり参照を比較することです。Equals をオーバーライドすると、比較をオブジェクトの状態に基づくように変更できます。つまり、論理的に等しいということです。hashCode もオーバーライドすることを忘れないでください。これを行わないと、オブジェクトが HashSet または HashTable で使用されたときに奇妙な動作が発生する可能性があります。

于 2010-11-02T15:53:08.310 に答える