Java 构造具有特定值的HashMap

Java 构造具有特定值的HashMap,java,jakarta-ee,Java,Jakarta 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.plu

我有一个如下所示的模块列表,我尝试构建一个没有重复键的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))
);
我想构造一个HashMap。它的键是模块的名称,它的值是模块的最新日期,因此输出应该是
{l=2010-5-4,s=2010-5-10}
,那么有什么有效的方法可以做到这一点吗?

最简单的方法就是按日期排序(例如,使用
比较器),然后迭代:

Map<String, DateTime> map = new HashMap<>();
for (Module module : sortedList) {
    map.put(module.getName(), module.getDate());
}
Map Map=newhashmap();
用于(模块:分类列表){
put(module.getName(),module.getDate());
}
这将用后面的值覆盖前面的值,因为它们将出现在列表的后面

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


您也可以使用Java8流来实现这一点,但是
Collectors.toMap
会在遇到重复键时抛出异常,这使得它稍微复杂一些。您可以改为按名称分组,然后只取每个模块的最新元素,但这可能会比上面简单的方法更复杂。

谢谢Jon,但我们不允许更改模块,那么还有其他的排序方法吗?@simon.Liu:我从来没有建议过更改模块-编写一个
比较器
,按日期比较模块,并将其传递给排序方法。
Map<String, DateTime> map = new HashMap<>();
for (Module module : sortedList) {
    map.put(module.getName(), module.getDate());
}