1

私は、JavaでのSetインターフェイスのカスタム実装の背後にある抽象的なアイデア全体を理解するのに苦労してきました。私たちの講義では、機能セット、さらにはフラグセットを実装しました。どちらも、セットの実装用に正確に構築された機能を備えた本質的に再帰的なリストのようです。

一部のカスタム実装ではリストからオブジェクトが削除されない場合でも、1日の終わりに、セット内のオブジェクトは単純なfor-eachループを使用してセットから呼び出されます。

たとえば、前述のこの機能セットでは、{1,2,3}はAdd 3、Add 2、Add 1、Emptyとして表されますが、直後に呼び出されるremove(2)メソッドはRemove 2、Add 3、Add2のようになります。 、1を追加、空。次に、Javaは、要素がセットの一部であるかどうかをどのような基準で決定しますか?オブジェクトがセットにまだ存在するかどうかを判断するために、add()メソッドとremove()メソッドでのみ機能しますか?

十分に首尾一貫していることを願っています。

4

5 に答える 5

2

私たちの講義では、機能セット、さらにはフラグセットを実装しました。どちらも、セットの実装用に正確に構築された機能を備えた本質的に再帰的なリストのようです。

これらの実装は、Javaセットにとって特に有益ではない可能性があります。Javaセットは変更可能です...機能しません。とにかく、Java Set APIの一般的な仕様は、java.util.Setインターフェースのjavadocによって提供されます。


次に、Javaは、要素がセットの一部であるかどうかをどのような基準で決定しますか?

セット/コレクションの「コントラクト」では、これequals(Object)を決定するために使用する必要があります。たとえば、Collection.contains(Object)メソッドは次のように指定されます。

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

Comparableさまざまなセットの実装により、これが/ ComparatorAPIまたはに置き換えられますObject.hashCode()。詳細は、それぞれの実装クラスjavadocsにあります。

ただし、カスタムSet実装が契約に従うという保証はありません。


オブジェクトがセットにまだ存在するかどうかを判断するために、add()メソッドとremove()メソッドでのみ機能しますか?

他のSetメソッド(などcontains())も、オブジェクトがセットメンバーであるかどうかを知る必要があります...それがあなたが求めていたものであるかどうか。

于 2012-12-17T22:49:01.413 に答える
0

Oracleが提供するJavaソースコードを確認しましたか?始めるのに良い場所です。クラスSetのメソッドをチェックすると、質問に答えることができます。

セットとリストの主な違いは、セットが順序を尊重しないことです。したがって、特定の順序でアイテムを追加した場合、同じ順序でアイテムを元に戻すことは保証されません。これは、Setが順序を最適化して、可能な限り最速のアクセス時間を達成するためです。したがって、ほとんどの場合、セットはファサートです。

于 2012-12-17T22:46:44.250 に答える
0

次に、Javaは、要素がセットの一部であるかどうかをどのような基準で決定しますか?

機能セットの実装の作成者によってプログラムされたものは何でも。Javaにはそのような実装が組み込まれていないため、確認できるソースコードがあるかどうかを知る方法はありません。

于 2012-12-17T22:48:05.850 に答える
0

(から)右から始めてEmpty、左に向かって作業します。最終的には、その時点でのセットの状態になります。

コードが実行しているのは、既存のセット(空のセットから開始)と単一の変更(要素の追加または削除)から新しい不変のセットを作成することです。これは、すべてが不変であるため、関数型言語でセットを作成する方法です。

于 2012-12-17T22:51:29.770 に答える
0

存在しないアイテムを削除するか、2回追加されたアイテムを削除しても、理論上のセットと矛盾する方法で動作するかどうかを尋ねていますか?次に、いいえ、とSetによってメンバーを学習して忘れます。add()remove()

于 2012-12-17T22:52:00.830 に答える