HashMap<String, Object> - 如何 return 一个只有参数的对象?
HashMap<String, Object> - How to return an Object having only its argument?
鉴于以下细节,我需要编写一个 return 对象 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
中,其中每个对象的键与 lastName
相同。值显然是 Person
Object.
private final Map<String, Person> employeeHM = new HashMap<>();
...
employeeHM.put("Doe", new Person("Jon", "Doe", 14, "Sales");
我用几种解决方案解决了这个问题,但都失败了。有没有办法直接比较 firstName
与 lastName
和 return 匹配对象?我的想法之一是使用 Set
或 Colleciton
,但我相当确定这会使事情过于复杂。
@Override
public Person findPersonByFirstName(String firstName) {
// ?
}
只需遍历您的地图并找到名字正确的人:
private Person getPersonByFirstName(String firstName) {
for (Person p : employeeHM.values()) {
if (p.getFirstName().equals(firstName))
return p;
}
return null;
}
请注意,这会给您找到第一个名字正确的人。如果多个人确实有相同的名字,那么您得到的名字可能是随机的。
我不为你写代码。但以下是我的想法。
只需获取 Map (map.values()
) 的所有值。并遍历它们。检查名字是否匹配并 return 它。请注意,您最终可能会遇到多个具有相同名字的人,因此可能需要更改 return 类型。
另一个建议是,使用名字或姓氏作为 Map 的键几乎是一个更糟糕的主意。如果我是你,我会使用他的 Id 或 DeskNo 作为唯一的密钥。
正如其他人已经建议的那样,如果您迭代值而不是键,就可以实现这一点。
但这真的是你想要做的吗?如果是,为什么不用名字作为键呢? Map
的想法是,对于每个 unique 键,您有一个或多个值,从 Map
获得具有 O(1) 复杂度。迭代值以获得密钥有点奇怪,它具有 O(n) 复杂度。
在这种情况下,我强烈建议您重新考虑您的数据结构并尝试使用更适合您使用的内容。
首先,您应该重新考虑在这种情况下使用 HashMap,因为显然您的密钥并不总是相同的。您要实现的几乎是数据集机制,您可以考虑使用数据库和适当的查询语言。
绝对没有理由使用 hashMap,除非你的实体(人)实际上有某种键,即一个显着标识实体的字段。
作为快速修复,如果您使用 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);
注意这将 return 第一个与过滤器 lambda 匹配的元素,如果找到 none 则为空。
此外,解析是内联完成的这一事实消除了对特定查找方法的需求,就像您拥有的那样。只需在任何地方调用 lambda 表达式,Java 框架将代表您完成所有魔法。
我认为您要查找的是找到具有给定名字和姓氏的人,同时存储在给定的 HashMap 中。
您可以做一个 List as Value(并遍历它),或者使用 HashMap 的 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");
鉴于以下细节,我需要编写一个 return 对象 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
中,其中每个对象的键与 lastName
相同。值显然是 Person
Object.
private final Map<String, Person> employeeHM = new HashMap<>();
...
employeeHM.put("Doe", new Person("Jon", "Doe", 14, "Sales");
我用几种解决方案解决了这个问题,但都失败了。有没有办法直接比较 firstName
与 lastName
和 return 匹配对象?我的想法之一是使用 Set
或 Colleciton
,但我相当确定这会使事情过于复杂。
@Override
public Person findPersonByFirstName(String firstName) {
// ?
}
只需遍历您的地图并找到名字正确的人:
private Person getPersonByFirstName(String firstName) {
for (Person p : employeeHM.values()) {
if (p.getFirstName().equals(firstName))
return p;
}
return null;
}
请注意,这会给您找到第一个名字正确的人。如果多个人确实有相同的名字,那么您得到的名字可能是随机的。
我不为你写代码。但以下是我的想法。
只需获取 Map (map.values()
) 的所有值。并遍历它们。检查名字是否匹配并 return 它。请注意,您最终可能会遇到多个具有相同名字的人,因此可能需要更改 return 类型。
另一个建议是,使用名字或姓氏作为 Map 的键几乎是一个更糟糕的主意。如果我是你,我会使用他的 Id 或 DeskNo 作为唯一的密钥。
正如其他人已经建议的那样,如果您迭代值而不是键,就可以实现这一点。
但这真的是你想要做的吗?如果是,为什么不用名字作为键呢? Map
的想法是,对于每个 unique 键,您有一个或多个值,从 Map
获得具有 O(1) 复杂度。迭代值以获得密钥有点奇怪,它具有 O(n) 复杂度。
在这种情况下,我强烈建议您重新考虑您的数据结构并尝试使用更适合您使用的内容。
首先,您应该重新考虑在这种情况下使用 HashMap,因为显然您的密钥并不总是相同的。您要实现的几乎是数据集机制,您可以考虑使用数据库和适当的查询语言。
绝对没有理由使用 hashMap,除非你的实体(人)实际上有某种键,即一个显着标识实体的字段。
作为快速修复,如果您使用 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);
注意这将 return 第一个与过滤器 lambda 匹配的元素,如果找到 none 则为空。
此外,解析是内联完成的这一事实消除了对特定查找方法的需求,就像您拥有的那样。只需在任何地方调用 lambda 表达式,Java 框架将代表您完成所有魔法。
我认为您要查找的是找到具有给定名字和姓氏的人,同时存储在给定的 HashMap 中。
您可以做一个 List as Value(并遍历它),或者使用 HashMap 的 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");