哪个系列最适合这个

时间:2013-03-04 15:02:33

标签: java data-structures collections

我有100个员工对象。员工对象有名称,年龄,工资。我应该在某个时候检索一名具有特定姓名的员工。

我只是想着

HashMap<String, List>

键入键,列表中的所有对象。

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

任何关于最佳集合而不是地图的想法。随时检索。

6 个答案:

答案 0 :(得分:2)

您应首先创建包含所有相关字段(姓名,年龄,工资等)的Employee课程 然后,您可以使用HashMap

 Map<String, Employee> map = new HashMap<String, Employee>();

答案 1 :(得分: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);

您可以找到更多示例here

对于年龄来说,找到年龄大于30岁的员工是有用的:

HasArgumentWithValue<Employee, Integer> matcher = Lambda.having(Lambda.on(Employee.class).getAge(), Matchers.greaterThan(30)) 

答案 2 :(得分:0)

虽然地图不会延伸集合类;但Map仍然是一种集合。因此,如果您的目的由 HashMap 提供;然后会建议去吧。

 HashMap<String, Employee> map = new HashMap<String, Employee>();

答案 3 :(得分: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
  }
}

答案 4 :(得分:0)

  

我应该检索一些员工或员工,其中包含特定名称   点。

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

答案 5 :(得分:0)

如果要将员工类中的name属性用作密钥,请确保您没有具有相同名称的员工。映射使用键,在您的情况下为String,每个键必须是唯一的。如果他们对HashMap&lt; 字符串名称,员工&gt;你没问题。

(创建包含所有属性的员工类)

但是,如果它们不是唯一的,许多员工可以使用相同的名称,则应考虑向员工类添加属性。像

这样的东西
private int ID;

并将其用作关键字:

HashMap<int, Employee>

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