2016-07-21 54 views
0

我有这个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中的值。

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

+0

您使用的是Java 8吗? – CKing

回答

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,也可以用foreach语句替换for循环:

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

之后,values[MANAGER, ADMIN, CONSULT]

+1

对于java 8,用'data来代替for循环。 values()。forEach(values :: addAll);' – bradimus

+0

@bradimus谢谢,补充。 –

2

的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>因为设置<元素>是不同的事情。

通过流观察。首先我们遍历List类型的集合的值。然后我们使用flatMap来将这个Set转换成它们元素的Stream。终端操作实际上是将它们收集在一个Set中,这将确保我们的元素不同。

+1

你必须把所有这些通用类放在'代码'格式中,或者它们被解释为HTML标签.... –

+0

@tobias_k谢谢我挣扎了一下:) –

0

从地图中,您可以使用map.values()检索所有集合。你有一套集合。

有了这个代码,你可以得到所有独特的套

Map<String, Set<String>> accounts = yourData; 
Set<String> uniqueSet = new HashSet<String>(); 
foreach(Set<String> data: account.values()) { 
    uniqueSet.addAll(data); 
} 
相关问题