HashMap <string,object =“”> - 如何返回仅包含其参数的Object?

时间:2015-11-30 13:36:00

标签: java hashmap key

鉴于以下细节,我需要编写一个返回Object Person的方法:

public class Person {

    private String firstName;
    private String lastName;
    private int deskNo;
    private String departmentName;
    ...
}
// this class also contains get methods for each argument

对象Person存储在HashMap中,其中Key与每个对象的lastName相同。值显然是Person对象。

private final Map<String, Person> employeeHM = new HashMap<>();
...
employeeHM.put("Doe", new Person("Jon", "Doe", 14, "Sales");

我用几个解决方案解决了这个问题但在每个实例中都失败了。有没有办法直接比较firstNamelastName并返回匹配的对象?我的一个想法是使用SetColleciton,但我很确定这会使事情过于复杂。

@Override
public Person findPersonByFirstName(String firstName) {
   // ?
}

5 个答案:

答案 0 :(得分:3)

只需遍历您的地图,找到正确名字的人:

private Person getPersonByFirstName(String firstName) {
    for (Person p : employeeHM.values()) {
        if (p.getFirstName().equals(firstName))
           return p;
    }
    return null;
}

请注意,这将为您找到第一个具有正确名字的人。如果多个人拥有相同的名字,那么你可能会随机获得一个名字。

答案 1 :(得分:2)

我不会为你编写代码。但下面是我的想法。

只需获取地图的所有值(map.values())。并迭代它们。检查名字是否匹配并返回。请注意,您最终可能会有多个具有相同名字的人,因此可能需要更改返回类型。

另一个建议是,使用名字或姓氏作为Map的密钥几乎是一个更糟糕的想法。如果我是你,我将使用他的Id或DeskNo作为唯一的钥匙。

答案 2 :(得分:2)

正如其他人已经建议的那样,如果你迭代值而不是键,就可以实现这一点。

但这真的是你想要做的吗?如果是,为什么不将第一个名称作为键呢? Map的想法是,对于每个唯一键,您有一个或多个值,从Map获得O(1)复杂度。迭代值来获取密钥有点奇怪,它具有O(n)复杂度。

在这种情况下,我强烈建议您重新考虑您的数据结构,并尝试更适合您的使用。

答案 3 :(得分:1)

首先,你应该重新考虑在这种情况下使用HashMap,因为显然你的密钥并不总是一样的。你想要实现的是几乎是数据集的机制,你可以考虑使用数据库和适当的查询语言。

绝对没有理由使用hashMap,除非你的实体(Person)实际上有某种键,即一个突出显示实体的字段。

作为快速修复,如果您使用的是Java8,则可以使用lambda表达式轻松实现所需的结果:

private final Collection<Person> employeeHM = new HashSet<>();

employeeHM.add(new Person("Jon", "Doe", 14, "Sales"));

并解析集合:

Person employeeDoe = employeeHM.stream().filter(person -> person.getLastName().equals("Doe")).findFirst().orElse(null);

Person employeeJon = employeeHM.stream().filter(person -> person.getFirstName().equals("Jon")).findFirst().orElse(null);

请注意,这将返回与过滤器lambda匹配的第一个元素,如果没有找到则返回null。

此外,解析是内联完成的,这样就无需使用特定的查找方法。只需在任何地方调用lambda表达式,Java框架代表您完成所有魔法。

答案 4 :(得分:1)

我认为你所寻找的是找到一个给定名字和姓氏的人,同时存储在给定的HashMap中。

您可以将List作为值(并遍历它)或使用HashMaps的HashMap进行硬核处理。 或者你可以使用名称的键值对象作为键。

private final Map<String, Map<String, Person>> employeeHM = new HashMap<>();

Map<String, Person> value = employeeHM.get("Doe");
if (value == null) {
  value = new HashMap<String, Person>();
  employeeHM.put("Doe", value);
}
value.put("Jon", new Person("Jon", "Doe", 14, "Sales");

GET由:

完成
Map<String, Person> does = employeeHM.get("Doe")
Person jonDoe = does.get("Jon");