Scala中的通配符字符串.getOrElse

时间:2015-09-17 13:52:41

标签: scala

我要做的是抓取任何可能是DECIMAL *

的东西
columnTypeMap.getOrElse("DECIMAL", Nil)

我不想硬编码:

 columnTypeMap.getOrElse("DECIMAL", Nil):::
           columnTypeMap.getOrElse("DECIMAL(14,2)", Nil)

数据:

columnTypeMap: Map[String,List[Int]] = Map(DECIMAL(14,2) -> List(93, 98, 103, 125, 133, 145), DECIMAL(12,0) -> List(2), DECIMAL(6,3) -> List(110), DECIMAL(6,0) -> List(84), DECIMAL(13,2) -> List(104), DECIMAL(10,2) -> List(120), DECIMAL(10,0) -> List(74)

我不确定如何在这种情况下使用通配符或在.getOrElse等语句中进行模式匹配

2 个答案:

答案 0 :(得分:3)

您正在寻找收集和开始使用:

scala> val map = Map(
     |   "DECIMAL(14,2)" -> List(1), 
     |   "NOT_DECIMAL(12,0)" -> List(2), 
     |   "DECIMAL(6,3)" -> List(3), 
     |   "DECIMAL(6,0)" -> List(4))
map: scala.collection.immutable.Map[String,List[Int]] = Map(DECIMAL(14,2) -> List(1), NOT_DECIMAL(12,0) -> List(2), DECIMAL(6,3) -> List(3), DECIMAL(6,0) -> List(4))

scala> map collect {
     |   case (key, value) if key startsWith "DECIMAL" => value 
     | }
res0: scala.collection.immutable.Iterable[List[Int]] = List(List(1), List(3), List(4))

请记住,这些将遍历地图中的所有值。如果您需要更高的性能,则应使用trie

答案 1 :(得分:2)

您可以使用scala标准库附带的TreeMap数据结构来实现此目的:

scala> import scala.collection.immutable._

scala> val map = TreeMap(
 | "DECIMAL(14,2)" -> List(1),
 | "NOT_DECIMAL(12,0)" -> List(2),
 | "DECIMAL(6,3)" -> List(3),
 | "DECIMAL(6,0)" -> List(4))
map: scala.collection.immutable.TreeMap[String,List[Int]] = Map(DECIMAL(14,2) -> List(1), DECIMAL(6,0) -> List(4), DECIMAL(6,3) -> List(3), NOT_DECIMAL(12,0) -> List(2))

scala> map.range("DECIMAL", "DECIMAM")
res5: scala.collection.immutable.TreeMap[String,List[Int]] = Map(DECIMAL(14,2) -> List(1), DECIMAL(6,0) -> List(4), DECIMAL(6,3) -> List(3))