0

我编写了一个基于 java 的 Web 应用程序,现在很简单,因为我是这个领域的初学者。当用户在 jsp 页面中输入此人的姓名时,它会查找此人的电话号码。我现在使用的是哈希图,我创建了两个对象,人和数字,基本上地图是人与数字的关联。我将 person 作为对象的原因是稍后我计划向 person 对象添加更多信息。我还计划最终将关联移至数据库。但是,在我有哈希图的这种特定情况下,如何处理“同名人员”的用例可以是两个不同的用户,因为根据我的哈希图,键是人员对象。具体来说,用户可以通过姓名查找此人。我还考虑将系统生成的 id 添加到 person 对象以使其唯一,但这并不能解决两个人同名的用例,因为当用户查询电话号码时,他只会输入人名.

4

3 回答 3

2

最简单的解决方案是让您的值类型是人员列表,因此:

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

听起来你的设计可以做一些工作。例如,当您进行原型设计(预数据库)时,是否有任何理由需要使用 HashMap?为什么不只存储 a 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);

您保留 Martin 建议的人员列表,并将值作为人员列表而不是单个人员。

在迭代时...

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

我在这里添加第二个答案。我的另一个答案显示了如何用 a 来实现它Map,但我认为这不值得。

如果您使用 a 是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 回答