0

私はこの分野の初心者なので、今のところ単純なJavaベースのWebアプリケーションを作成しました。ユーザーがjspページに人の名前を入力すると、人の電話番号が検索されます。今のところハッシュマップを使用しています。ここでは、人と番号の2つのオブジェクトを作成しました。基本的に、マップは人と番号の関連付けです。人をオブジェクトとして持つ理由は、後で人オブジェクトにさらに情報を追加する予定です。また、最終的には関連付けをデータベースに移動する予定です。ただし、ハッシュマップがあるこの特定の状況では、「同じ名前の人」のユースケースをどのように処理するかは、ハッシュマップによるとキーが人オブジェクトであるため、2人の異なるユーザーになる可能性があります。具体的には、ユーザーは名前で人を検索できます。また、システムで生成されたIDをpersonオブジェクトに追加して一意にすることも考えましたが、ユーザーが電話番号を照会するときに人の名前のみを入力する場合と同じ名前の2人のユースケースは解決されません。 。

4

3 に答える 3

2

最も簡単な解決策は、値の型を人のリストにすることです。

Map<String, List<Person>> map = new HashMap...

あなたのデザインはちょっとした作業でできるように思えます。たとえば、プロトタイピング中 (データベースの前) に、HashMap を使用する必要がある理由はありますか? List<Person>を保存して、検索するたびにリストを反復しないのはなぜですか? これにより、人の他のプロパティも簡単に検索できます。

編集:フェニックスのコメントに応えて。

アプローチは、指定された名前を持つすべての人のリストをマップ内のリストに保存することです。

新しい人物を追加するには、その名前の人物が既に存在するかどうかを確認し、まだ人物が存在しない場合は空のリストを作成して追加する必要があります。[申し訳ありませんが、手元にコンパイラがないため、これをコンパイルまたはテストしていませんが、アイデアは正しいはずです]

void add(Map<String, List<Person>> map, Person p) {

    if (!map.containsKey(p.name()) {
        map.put(p.name(), new ArrayList<Person>());
    } 
    // The map will always have a (possibly empty) list of people with a given name now
    map.get(p.name()).add(p);
}

人を見上げるのは簡単です。特定の名前を持つすべての人を印刷するには:

void printPeople(BufferedWriter out, Map<String, List<Person>> map, String name) {
    for (Person p : map.get(name)) {
        out.println(p.toString());
    }
}
于 2012-08-14T04:01:18.660 に答える
1

これはどうですか?

Map<String, List<Person>> map = new HashMap<String, List<Person>>();

if(!map.contains(personName)){
    map.put(personName, new ArrayList<Person>());
}

// Construct Person person = new Person(personName, phoneNumber);

map.get(personName).add(person);

マーティンが提案したように人のリストを保持し、値を単一の人の代わりに人のリストとして配置します。

繰り返しながら…

for(Person person : map.get(personName)){
    // Process person.getPhoneNumber();
}
于 2012-08-14T04:11:17.310 に答える
1

ここに 2 番目の回答を追加します。私の他の答えは、それを aMapで実装する方法を示していますが、努力する価値があるとは思いません。

パフォーマンスが心配なために を使用してHashMapいる場合は、言及したデータベース バックエンドを配置すると修正されます。原則として、いずれにしても破棄することがわかっているコードや、最適化が必要かどうかさえわからないコードの最適化に労力を費やさないでください。

私の解決策(実際のバックエンドを保留中)は、リストを使用することです。アルゴリズムを正しくすることを心配する必要はありませんhashCode。何千ものエントリがない限り、結果が大幅に遅くなるとは思えません。

public class People {
    private List<Person> people = new ArrayList<Person>();

    public void add(Person p) {
        people.add(p);
    }

    public List<Person> findByName(String name) {
        List<Person> result = new ArrayList<Person>();
        for (Person p : people) {
            if (p.getName().equals(name)) {
                result.add(p);
            }
         }
         return result;
     }

Mapソリューションよりもはるかに単純で明確です。

于 2012-08-14T04:31:10.507 に答える