的名單上有使用多重映射性狀的地圖,像這樣
val multiMap = new HashMap[Foo, Set[Bar]] with MultiMap[Foo, Bar]
我想過濾特定值
multiMap.values.filter(bar => barCondition)
此地圖結合了平坦化的匹配結果到形式元組列表
val fooBarPairs: List[(Foo, Bar)]
這樣做的慣用方式是什麼?我希望Scala可能會提供類似於變形的東西來做這個沒有循環的東西,但作爲一個完整的新手,我不確定我的選擇是什麼。過濾Scala的Multimap之和輸出爲元組
回答
下面是一個例子:
import collection.mutable.{HashMap, MultiMap, Set}
val mm = new HashMap[String, Set[Int]] with MultiMap[String, Int]
mm.addBinding("One", 1).addBinding("One",11).addBinding("Two",22).
addBinding("Two",222)
// mm.type = Map(Two -> Set(22, 222), One -> Set(1, 11))
我認爲最簡單的方法來得到你想要的是使用的表達:
for {
(str, xs) <- mm.toSeq
x <- xs
if x > 10
} yield (str, x) // = ArrayBuffer((Two,222), (Two,22), (One,11))
您需要.toSeq
或輸出類型將是一個Map
,這將意味着每個映射是由後續元素過度。如果您需要List
,請在此輸出上使用toList
。
我喜歡它,序列理解很適合這個問題。 – MilesHampson 2012-07-22 12:25:06
如果使用'collection.breakOut',則不需要'toSeq'。 – Debilski 2012-07-22 12:35:30
@Debilski被吸引。你可以在for表達式中使用'breakOut'嗎?或者就在你將它脫糖至@ mhs的答案時。 – 2012-07-22 13:06:22
這裏是什麼,我覺得你想要做一個例子:
scala> mm
res21: scala.collection.mutable.HashMap[String,scala.collection.mutable.Set[Int]] with scala.collection.mutable.MultiMap[String,Int]
= Map(two -> Set(6, 4, 5), one -> Set(2, 1, 3))
scala> mm.toList.flatMap(pair =>
pair._2.toList.flatMap(bar =>
if (bar%2==0)
Some((pair._1, bar))
else
None))
res22: List[(String, Int)] = List((two,6), (two,4), (one,2))
這是有幫助的,我沒有考慮做這兩個級別的細分。我只使用匹配類型,所以我想我必須再次用這個來過濾None類型。這似乎是一個很好的通用解決方案。 – MilesHampson 2012-07-22 12:36:18
這裏是另一個,稍微更簡潔的解決方案:
import collection.mutable.{HashMap, MultiMap, Set}
val mm = new HashMap[String, Set[Int]] with MultiMap[String, Int]
val f = (i: Int) => i > 10
mm.addBinding("One", 1)
.addBinding("One",11)
.addBinding("Two",22)
.addBinding("Two",222)
/* Map(Two -> Set(22, 222), One -> Set(1, 11)) */
mm.map{case (k, vs) => vs.filter(f).map((k, _))}.flatten
/* ArrayBuffer((Two,222), (Two,22), (One,11)) */
過濾然後重建地圖似乎是解決這個問題的好方法,如果可以的話,我會給你點數。我確實需要結果作爲列表而不是由flatten函數給出的迭代器。 – MilesHampson 2012-07-22 12:56:36
您可以通過''flatten.toList''或''toList.flatten''獲取列表。 – 2012-07-22 13:10:18
- 1. Scala過濾元組列表
- 2. Scala過濾元組列表中元素的條件總和
- 3. 過濾HTML爲JavaScript輸出
- 4. 視頻構建過濾器的輸入和輸出過濾器?
- 5. 在Scala中組合地圖和過濾器空出
- 6. 過濾元組
- 7. 過濾的元組
- 8. 在隔板之間SEQ /陣列的Scala過濾元件
- 9. Scala:讀取和過濾行
- 10. 的Node.js - Multimap之
- 11. AngularJs過濾到單個數組元素並輸出屬性
- 12. 過濾logcat輸出
- 13. 過濾SaltStack輸出
- 14. 過濾pexpect輸出
- 15. 打印Multimap之在爲了
- 16. F#和元組輸出
- 17. 在輸出爲Json之前從Dto過濾屬性
- 18. windbg的過濾器輸出
- 19. django過濾器:可以過濾元組?
- 20. 過濾Python的元組
- 21. 過濾元組的列表
- 22. SQL沒有返回輸出和過濾
- 23. Logstash過濾和解析模輸出
- 24. scala數據框過濾器數組過濾器
- 25. C++對Multimap之
- 26. Scala將元組的迭代過程轉換爲數組Tuple._2
- 27. 在Matlab中過濾出數組/元素中的元素
- 28. 濾波器輸出和推過濾後的數據與慶典
- 29. 分組由函數值進Multimap之
- 30. AngulajrJS過濾器輸出html
如果FOO映射到一組條形所有滿足過濾謂詞,結果列表是否包含所有酒吧的元組(foo,bar)?如果你給出了一些說明例子,這將是有幫助的。 – 2012-07-22 11:10:16
在我的問題「匹配結果」是爲了指定我只對通過篩選條件的Bars感興趣,如果不清楚,則表示抱歉。 – MilesHampson 2012-07-22 13:02:21