我想知道如何实现这个场景-我有一对整数(a,b)的列表-例如
[[0 3][0,3],[0, 4],[1,2],[1, 8],[1、14],[2、4],[2、5],[2,6]]——的列表类型PairInt
The pairInt functionality is defined like this:
class PairInt {
int first, second;
public PairInt(int first, int second) {
this.first = first;
this.second = second;
}
}
我想把这个整数对添加到一个Map中,这样它就像这样组织:{0:[3,3,4], 1:[2,8,14], 2:[4,5,6]}),例如键0应该有与其相关的值,等等。
假设我有一个这样声明的HashMap:
HashMap<Integer, List<Integer>> dm = new HashMap<Integer, List<Integer>>();
这可以在Python中简单地完成,如
mapd= defaultdict(list)
for first, second in pairList:
mapd[first].append(second)
print(mapd)
遍历列表并将其添加到Map中,这样它就采用了上面提到的组织。如何在Java中为上面提到的HashMap结构重现这种行为
建议吗?由于
这是一种方法。
使用Collectors.groupingBy
按对的第一个元素分组。该值是作为列表收集的对的第二个元素。
dm = pairInts.stream()
.collect(Collectors.groupingBy(pairInt -> pairInt.first,
Collectors.mapping(pairInt -> pairInt.second, Collectors.toList())));
如果你有getter在你的PairInt
类,你可以写使用方法引用:
pairInts.stream()
.collect(Collectors.groupingBy(PairInt::getFirst,
Collectors.mapping(PairInt::getSecond, Collectors.toList())));
最简单的方法是使用guava multimap(只需将所有对添加为键值对)。你想要的地图是它的一个特殊视图。