0

我有 100 个员工对象。Employee 对象有姓名、年龄、薪水。我应该在某个时候检索一个或多个具有特定名称的员工。

我只是在想

HashMap<String, List>

名称输入到键中,所有对象都输入到列表中。

我知道地图不是一个集合:P

任何关于最佳收藏而不是地图的想法。随时取回。

4

6 回答 6

2

您应该首先创建Employee包含所有相关字段(姓名、年龄、薪水等)的类,然后您可以使用HashMap

 Map<String, Employee> map = new HashMap<String, Employee>();
于 2013-03-04T15:06:49.820 回答
1

如果你有一个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)) 
于 2013-03-05T12:24:56.720 回答
0

如果您想使用Employee类中的 name 属性作为键,请确保您没有同名的员工。该地图使用一个键,在您的情况下是一个字符串,并且每个键都必须是唯一的。如果他们是你对 HashMap< String name, Employee> 没问题。

(创建具有所有属性的Employee类)

但是,如果它们不是唯一的,许多员工可以有相同的名字,您应该考虑向Employee类添加一个属性。就像是

private int ID;

并将其用作键,如下所示:

HashMap<int, Employee>

HashMap 在时间复杂度上非常好。平均而言,get()调用将获得时间 T(n) = O(1)(即在恒定时间内)。看跌期权也是如此。

于 2013-03-04T15:20:26.780 回答
0

我不知道为什么 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
  }
}
于 2013-03-04T15:11:29.810 回答
0

我应该在某个时候检索一个或多个具有特定名称的员工。

从上面的行中,我认为您有多个同名的员工。如果是这种情况,我建议使用 guava 的Multimap。例如HashMultimap

于 2013-03-04T15:12:12.040 回答
0

虽然Map没有扩展Collection类;但 Map 仍然是 Collection 的一种。因此,如果您的目的是由HashMap服务的;然后会建议去。

 HashMap<String, Employee> map = new HashMap<String, Employee>();
于 2013-03-04T15:04:07.410 回答