构造具有特定值的HashMap

时间:2015-04-05 07:38:26

标签: java java-ee

我有一个模块列表,如下所示,我尝试构建一个没有重复键的HashMap,值是最新的。

DateTime start = new DateTime(2010, 5, 1, 12, 0, 0, 0);
List<Module> modules = Arrays.asList(
   new Module("s", start.plusDays(4)),
   new Module("l", start.plusDays(3)),
   new Module("s", start.plusDays(2)),
   new Module("s", start.plusDays(9)),
   new Module("s", start.plusDays(1))
);

模块:

public class Module {
   private String name;
   private DateTime date;

   public Module(String name, DateTime date) {
      this.name = name;
      this.date = date;
   }
   //getter methods;

我想构建一个HashMap。它的Key是模块的名称,它的Value是模块的最新日期,所以输出应该是{l=2010-5-4,s=2010-5-10},那么有没有有效的方法呢?

1 个答案:

答案 0 :(得分:1)

最简单的方式只是按日期排序(例如使用Comparator<Module>)然后只是迭代:

Map<String, DateTime> map = new HashMap<>();
for (Module module : sortedList) {
    map.put(module.getName(), module.getDate());
}

这将覆盖之前的值,因为它们将在列表的后面出现。

可能有一些更有效的方法可以做到这一点,但它们不太可能那么简单 - 我会首先使用简单的方法,看看它是否足够有效。

您也可以使用Java 8流来执行此操作,但Collectors.toMap如果遇到重复键会抛出异常,使其稍微复杂一些。您可以通过名称进行分组,然后只取每个元素的最新元素,但这又可能最终比上面的简单方法更复杂。