2

Personを、属性name、age、およびidNumberを持つクラスとします。「Persons」のコレクションが欲しいのですが、次の操作を最も効率的に実行できるようにしたいと思います。

  1. idNumberでそれらを取得します。
  2. 年齢>Xの人のリストを取得します。
  3. 名前のアルファベット順にソートされたすべての人のリストを取得します。

私の考えは、各TreeMapのキーとしてidを使用するハッシュマップと、キーとして年齢と名前を使用する2つのTreemapを同時に維持することです。

  1. これが最善の方法ですか?
  2. 年齢を編集して元に戻す前に、年齢TreeMapから人を削除する必要がありますか?
  3. 質問2の答えが「はい」の場合、その人が複数の場所で使用され、編集されている可能性がある場合、どうすればそれを処理できますか?
4

1 に答える 1

2

これが最善の方法ですか?

リレーショナルデータベースと適切なインデックス作成を使用するのが最善の方法だと思いますが、これをメモリ内で実行したい場合は、そうです。パフォーマンスのためにメモリを犠牲にしていることになります。

年齢を編集して元に戻す前に、年齢TreeMapから人を削除する必要がありますか?

はい。ツリー内のアイテムの位置は、追加されるときに1回決定されます。同等のプロパティ(ageまたはname)が変更された場合、TreeMapはそれを魔法のように発見してオブジェクトを移動することはありません。これにより、マップ内に要素が存在していても、マップ内の要素を見つけることができなくなる可能性があります。

質問2の答えが「はい」の場合、その人が複数の場所で使用され、編集されている可能性がある場合、どうすればそれを処理できますか?

ツリーにすでに配置されているオブジェクトを変更できないように、不変オブジェクトを優先します。何らかの理由でその余裕がない場合は、パターンを検討してください。Personマップにを格納するときは、リスナーをそのに登録してPersonください。たとえばage変更すると、リスナーは年齢別に人を保存しているツリー(または別のオブザーバー)に通知し、削除と追加を処理します。

ところで、変更された後にオブジェクトを削除しようとすると、失敗します-削除TreeMapするオブジェクトを見つけることができなくなります...

于 2012-04-14T16:28:49.537 に答える