我有一组字符串如下
Set<String> ids;
每个ID的格式为#userId:#sessionId
,例如1:2
其中1是userId,2是sessionId。
我想将这些分成userId,这将是HashMap中的关键,每个userId都是唯一的。但每个userId可以有多个会话。那么如何从Set<String>
到Map<String, List<String>>
例如
如果集合包含以下值{1:2, 2:2, 1:3}
地图应包含
key=1 value=<2,3>
key=2 value=<2>
答案 0 :(得分:0)
通过“lambdas”我假设你的意思是流,因为构建地图的简单循环并不需要lambdas。如果是这样,你可以使用一些内置的Collectors
来接近但不完全相同。
Map<String, List<String>> map = ids.stream()
.collect(Collectors.groupingBy(id -> id.split(":")[0]));
// result: {"1": ["1:2", "1:3"], "2": ["2:2"]}
这将按左数字分组,但会将完整字符串存储在地图值中,而不是仅存储在右侧部分。
Map<String, List<String>> map = ids.stream()
.collect(Collectors.toMap(
id -> id.split(":")[0],
id -> new ArrayList<>(Arrays.asList(id.split(":")[1])),
(l1, l2) -> {
List<String> l3 = new ArrayList<>(l1);
l3.addAll(l2);
return l3;
}
);
// result: {"1": ["2", "3"], "2": ["2"]}
这将完全返回您想要的,但遭受严重的低效率。它不是将所有相等的元素添加到单个列表中,而是创建许多临时列表并将它们连接在一起。这将O(n)操作转变为O(n 2 )操作。
答案 1 :(得分:-1)
您可以使用HashMap<Integer,Set<T>>
或HashMap<Integer,List<T>>
,其中T是value1,value2等的类型。
我认为您要求similar to this question。
此外,这是how to proceed with this problem上几个解决方案的链接。