我编写了一个基于 java 的 Web 应用程序,现在很简单,因为我是这个领域的初学者。当用户在 jsp 页面中输入此人的姓名时,它会查找此人的电话号码。我现在使用的是哈希图,我创建了两个对象,人和数字,基本上地图是人与数字的关联。我将 person 作为对象的原因是稍后我计划向 person 对象添加更多信息。我还计划最终将关联移至数据库。但是,在我有哈希图的这种特定情况下,如何处理“同名人员”的用例可以是两个不同的用户,因为根据我的哈希图,键是人员对象。具体来说,用户可以通过姓名查找此人。我还考虑将系统生成的 id 添加到 person 对象以使其唯一,但这并不能解决两个人同名的用例,因为当用户查询电话号码时,他只会输入人名.
3 回答
最简单的解决方案是让您的值类型是人员列表,因此:
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());
}
}
那这个呢?
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();
}
我在这里添加第二个答案。我的另一个答案显示了如何用 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
解决方案更简单、更清晰。