【问题标题】:Which collection best suits this哪个系列最适合这个
【发布时间】:2013-02-18 17:12:21
【问题描述】:

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

我只是想

HashMap<String, List>

name 到 key,所有对象到 list。

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

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

【问题讨论】:

  • HashMap有什么问题?
  • 你有同名的庇隆人吗?你可以对他们的名字做一些花招吗?

标签: java data-structures collections


【解决方案1】:

如果您有List&lt;Employee&gt; 并且您想按姓名或年龄等过滤列表,我猜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】:

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

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

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

    private int ID;
    

    并像这样使用它作为键:

    HashMap<int, Employee>
    

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 谢谢。我有同名的人!!
      【解决方案4】:

      不知道为什么 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
        }
      }
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • 莱。我只是想知道如何通过收集来实现这一点。不是地图。
          • 如果您想使用员工姓名检索员工;然后去HashMap。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-30
          • 2018-05-19
          相关资源
          最近更新 更多