我有 100 个员工对象。Employee 对象有姓名、年龄、薪水。我应该在某个时候检索一个或多个具有特定名称的员工。
我只是在想
HashMap<String, List>
名称输入到键中,所有对象都输入到列表中。
我知道地图不是一个集合:P
任何关于最佳收藏而不是地图的想法。随时取回。
我有 100 个员工对象。Employee 对象有姓名、年龄、薪水。我应该在某个时候检索一个或多个具有特定名称的员工。
我只是在想
HashMap<String, List>
名称输入到键中,所有对象都输入到列表中。
我知道地图不是一个集合:P
任何关于最佳收藏而不是地图的想法。随时取回。
您应该首先创建Employee
包含所有相关字段(姓名、年龄、薪水等)的类,然后您可以使用HashMap
:
Map<String, Employee> map = new HashMap<String, Employee>();
如果你有一个List<Employee>
并且你想按名称或年龄等过滤列表,我猜lambdaj很适合这个目的。
这是一个示例,假设您要按姓名过滤所有员工:
HasArgumentWithValue<Employee, String> matcher = Lambda.having(Lambda.on(Employee.class).getName(), Matchers.equalTo(name));
List<Employee> filteredEmployess = Lambda.filter(matcher, allEmployess);
通过静态导入,上面的代码将是:
List<Employee> filteredEmployess = filter(having(on(Employee.class).getName(), equalTo(name)), employees);
您可以在此处找到更多示例
对于年龄,查找年龄超过 30 岁的员工会很有用:
HasArgumentWithValue<Employee, Integer> matcher = Lambda.having(Lambda.on(Employee.class).getAge(), Matchers.greaterThan(30))
如果您想使用Employee类中的 name 属性作为键,请确保您没有同名的员工。该地图使用一个键,在您的情况下是一个字符串,并且每个键都必须是唯一的。如果他们是你对 HashMap< String name, Employee> 没问题。
(创建具有所有属性的Employee类)
但是,如果它们不是唯一的,许多员工可以有相同的名字,您应该考虑向Employee类添加一个属性。就像是
private int ID;
并将其用作键,如下所示:
HashMap<int, Employee>
HashMap 在时间复杂度上非常好。平均而言,get()调用将获得时间 T(n) = O(1)(即在恒定时间内)。看跌期权也是如此。
我不知道为什么 HashMap 不适合您的需求,但是如果您希望能够迭代所有员工(就好像它是一个集合一样),您仍然可以使用:
Map<String, List<Employee>> map = new HashMap<String, List<Employee>>();
// populate your map
for (List<Employee> list : map.values()) {
for (Employee employee : list) {
// do something
}
}
我应该在某个时候检索一个或多个具有特定名称的员工。
从上面的行中,我认为您有多个同名的员工。如果是这种情况,我建议使用 guava 的Multimap。例如HashMultimap
虽然Map没有扩展Collection类;但 Map 仍然是 Collection 的一种。因此,如果您的目的是由HashMap服务的;然后会建议去。
HashMap<String, Employee> map = new HashMap<String, Employee>();