2012-02-13 8 views
1

を検索、我々はより良​​いオブジェクトのリンクのマップを実装するように求めていました。要するにJavaのHashMapの継続的なクラスのプロジェクトの一環として

、我々は現在のオブジェクトに保持4つのArrayListを持って

// Array Lists used for sorting. 
private static ArrayList<Party> partyList = new ArrayList<Party>(); 
private static ArrayList<Creature> creatureList = new ArrayList<Creature>(); 
private static ArrayList<Treasure> treasureList = new ArrayList<Treasure>(); 
private static ArrayList<Artifact> artifactList = new ArrayList<Artifact>(); 

各クラスは、独自のフィールドを有する(すなわち、党は「インデックス」、「名前」、クリーチャーが持つ「インデックス」、「名前」を持っています、「年齢」、高さ」、等...しかし、彼らすべてが一意のインデックスを持っている)

今週はオブジェクトのキーは、そのインデックスでハッシュマップを実装している。

ので、 、例として:

creatureMap.put(creature.index, creature) 
... 

私たちのプログラムも検索できます。だから私はインデックスで検索するとき、私たちが望むインデックスに対して適切なハッシュマップを検索し、その値であるオブジェクトで作業することを理解しています。

しかし、私たちのプログラムは、インデックスで検索する場合、それが唯一の場合に役立ちますハッシュマップを効率的にここで使用されているか、ユーザーがそう名前、身長、体重などによって検索することができますか?私が名前で生き物を検索したい場合はどうなりますか?私は、ハッシュマップのすべての値をループしなければならないでしょう、その '名前'フィールドを見てください。これは、私がarraylistとやっているものです。

アイデアが最初のプロジェクトでは、単純なアプローチは インサートに配列リストにすべての項目だったということです、もう1つは をリンクするために必要なとき:誰かが同様の質問をしたときに

私たちの教授はこのように述べクリーチャーをパーティーに参加させるか、クリーチャーにアイテムを渡す場合、アイテムのインデックスが見つかるまで、 はArrayListを直線的に検索する必要があります。 リストをソートするが、ソートは、典型的には、O(N * N) またはO(Nログn)依存である場合、これは、ArrayListのがソートされていない場合はO(N)操作であり、O(Nログ) 操作使用されたソート操作で

今週、私はマップデータ構造に基づいて、 O(1)検索システムを実装するためにあなたを求めています。したがって、リンクの生成には、項目のインデックスを とする必要があります。これは、入力ファイル の処理中に1回使用されます。

このように、Maps/Key-Valueペアの概念を正しく理解しているかどうかはわかりません。

答えて

3

あなたの理解は正しいです:あなたのキーがインデックスの場合は、あなただけ効率的にインデックスによってルックアップするためにマップを使用することができます。名前で検索したい場合は、名前をキー入力する必要があります。

私はあなたの教授が、このことにより、どのような意味であまりよく分からない:

したがって、我々はリンクを生成するために、そのキーとアイテムのインデックスを使用する必要があります。

(私は彼が「パーティーに生き物をリンク」のように、インデックスでオブジェクトをリンクを参照すると思う - 多分彼は検索するためのハッシュマップの使用を指すものではありませんでした)

サイドノートでは、具体的な型ではなくインタフェースに基づいて変数を宣言することは良い習慣です。あなたの例では、Listの代わりArrayListとしてリストフィールドを定義する必要があります

順でのご質問(と文)を介して実行
private static List<Party> partyList = new ArrayList<Party>(); 
1

....

ので、私はそれになりましたときに、私たちを理解しますインデックスで検索する場合は、必要なインデックスの適切なハッシュマップ を検索し、その値である オブジェクトで処理します。

これは間違いありません。

しかし、私たちのプログラムでは、ユーザーは名前、高さ、重さなどで検索することもできます。インデックスで検索するときだけハッシュマップを効率的に使用する方法はありますか?

ハッシュマップがインデックスのみで保存されている場合は、他のフィールドで検索するのに役立たないということは間違いありません。あなたはまた、これらのフィールドのマップを作成することもできますが、私はそれがあなたの教授は、私は名前でクリーチャーを検索したい場合はどうなりますか(下記参照)

を望むものだと思いませんか?私は、ハッシュマップのすべての値をループしなければならないでしょう、その '名前'フィールドを見てください。これは、私がarraylistとやっているものです。

はい、名前で検索する必要がある場合は、values()メソッドを使用して、各項目をチェックして繰り返します。

1がクリーチャーに当事者に生き物、またはアイテムをリンクするために必要なときに、1項目のインデックスが
を発見したまでは直線のArrayListを検索しなければならないでしょうが...
したがって、我々は、リンクを生成するためのキーとして項目のインデックスを使用する必要があります。これは、入力ファイルの処理中に1回使用されます。

これは、割り当てのもう一つの部分があることを示唆しています - ファイルからの入力を読み、パーティ、生き物とアイテムを結びつけることと関係があります。

私は、当事者の入力ファイルがindexでクリーチャーを参照しているとします(同様に、アイテムを参照するクリーチャーについても同様です)。
教授がこれらのハッシュマップを使用してスピードアップを望んでいるのは、その連携です。
私は確かに(私は割り当てが実際に言っているかわからないので、明らかにこれは推測です)、彼はあなたが検索の他の種類が

を動作する方法を変更するために取得しようとしている

+0

を考えていません。入力ファイルには、オブジェクトを作成する行が含まれています。たとえば、(p:001:週末の戦士)その行はパーティオブジェクトを作成するように指示し、そのインデックスは001で、その名前は週末の戦士です。同様に、クリーチャーはそのようになりますが、それに属するパーティーである別のインデックスも持ちます(c:250:conan:001) – sqram

+2

右。だからリストバージョンのコードでは、パーティー#001を見つけるためにリストを繰り返し処理しなければなりません。これにより、ファイル読込みのコードが比較的遅くなります(ループするパーティーがたくさんあるとき)。マップバージョンは、反復的な[O(n)]ルックアップの代わりにインデックス[O(1)]ルックアップを実行することによって、ファイル読み取りコードを高速化します。 – Tim

+0

ありがとうございます。私は2つの答えを受け入れることを望みます= | – sqram

関連する問題