我有一个模块列表,如下所示,我尝试构建一个没有重复键的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}
,那么有没有有效的方法呢?
答案 0 :(得分:1)
最简单的方式只是按日期排序(例如使用Comparator<Module>
)然后只是迭代:
Map<String, DateTime> map = new HashMap<>();
for (Module module : sortedList) {
map.put(module.getName(), module.getDate());
}
这将覆盖之前的值,因为它们将在列表的后面出现。
可能有一些更有效的方法可以做到这一点,但它们不太可能那么简单 - 我会首先使用简单的方法,看看它是否足够有效。
您也可以使用Java 8流来执行此操作,但Collectors.toMap
如果遇到重复键会抛出异常,使其稍微复杂一些。您可以通过名称进行分组,然后只取每个元素的最新元素,但这又可能最终比上面的简单方法更复杂。