从Map中获取Java,一个具有唯一元素的Set

时间:2016-07-21 17:46:36

标签: java dictionary set

我有Map<String, Set<String>>

{upload=[ADMIN], configure.accounts=[ADMIN, CONSULT], consult=[ADMIN, CONSULT], configure.merchants=[MANAGER, ADMIN], configure.invoices=[MANAGER, ADMIN], graphics=[MANAGER, ADMIN]}

我想获得一个像下一个结构Set<String>的结构:

[ADMIN, CONSULT, MANAGER]

过滤数据的位置,从地图中的Set中获取所有可能的值。如果我迭代整个Map并比较值,添加那些当前不在Set中的值,我就可以这样做。

是否有一些功能可以做到这一点?

3 个答案:

答案 0 :(得分:3)

Java 8解决方案:

 Map<String, Set<String>> test;
 Set<String> set = test.values()
                       .stream()
                       .flatMap(t->t.stream())
                       .collect(Collectors.toSet());

无论您使用Java 8还是Java低于8.您的最终目标是接收Set<String>个元素,因为Set&lt;&gt;中的元素是截然不同的。

通过视频观察。首先,我们迭代集合类型为List的值。然后我们使用flatMap将此Set转换为其元素的Stream。终端操作是在Set中实际收集它们,这将确保我们的元素是不同的。

答案 1 :(得分:2)

您不必检查个别值是否已经在Set中 - 该集合将负责这一点,这是什么集合。只需迭代值并将它们添加到所有值的集合中。

Map<String, Set<String>> data = new HashMap<>();
data.put("accounts", new HashSet<>(Arrays.asList("ADMIN", "CONSULT")));
data.put("merchants", new HashSet<>(Arrays.asList("MANAGER", "ADMIN")));

Set<String> values = new HashSet<>();
for (Set<String> set : data.values()) {
    values.addAll(set);
}

如果您使用的是Java 8,还可以使用for语句替换foreach循环:

data.values().forEach(values::addAll);

之后,values[MANAGER, ADMIN, CONSULT]

答案 2 :(得分:0)

从地图中,您可以使用CASE WHEN weekday = weekday_old THEN NULL ELSE weekday END AS weekday 检索所有集合。那里有一个集合集合。

使用此代码,您可以获得所有独特的集合

map.values()