2017-11-03 5 views
0

私は以下のScalaのコードを持っており、値の部品 を取得したいが、問題があるが、ループのためにネストされている:2つのforループを使用せずにscalaから値の部分を取得する方法は?あなたは以下を参照として

var result: Set[String]() 
val mapValues: Map[String, Set[String]] = ... 

// this returns Iterable[Set[String]] instead of Set[String], 
// so I had to use two for loops as you see below. 
val values: Iterable[Set[String]] = mapValues.values 

for(value <- values) { // problem: this is two for loops which is not good 
    for(v <- value) { 
    result.add(v) 
    } 
} 

Javaの用語では、これは私が欲しいものです:

Set<String> result = ... 
Map<String, Set<String>> mapValues = ... 

Set<String> values = mapValues.values(); 
for(String value: values) { 
    result.add(value); 
} 

mapValuesの値を取得したい場合はを結果セット変数に入れます。

しかし、上記の2つのforループを使用せずにScalaで行う方法はわかりません。

+1

'val result = mapValues.values.fold(Set())(_ ++ _) ' – jwvh

答えて

1

あなたは一つにforループ2を組み合わせることができます:

for (value <- values; v <- value) { 
    result.add(v) 
} 

またはネストされたコレクションに.flattenを呼び出す:

for (v <- values.flatten) { 
    result.add(v) 
} 
0

一つだけのループを使用してSetunion方法を使用することができます。

for(value <- values) { 
    result = result.union(value) 
} 
関連する問題