我有一个模块列表,如下所示,我试图构造一个没有重复键的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。它的键是模块的名称,它的值是模块的最新日期,所以输出应该是{l=2010-5-4,s=2010-5-10}
,那么有什么有效的方法吗?
发布于 2015-04-05 07:41:54
最简单的方法就是按日期排序(例如,使用Comparator<Module>
),然后迭代:
Map<String, DateTime> map = new HashMap<>();
for (Module module : sortedList) {
map.put(module.getName(), module.getDate());
}
这将覆盖较早的值和后面的值,因为它们将在列表中稍后出现。
也许有一些更有效的方法来做到这一点,但它们不太可能是那么简单--我会首先使用简单的方法,看看它是否足够有效。
您也可以使用Java8流来完成这个任务,但是如果遇到重复的键,Collectors.toMap
会抛出一个异常,这使它变得更加棘手。您可以按名称进行分组,然后只使用每个元素的最新元素,但这可能会比上面的简单方法更复杂。
https://stackoverflow.com/questions/29455174
复制相似问题