如何动态比较一个值,例如2与“< 10”,因为2< 10,所以返回true?

时间:2014-05-21 03:21:08

标签: scala

我有以下地图和清单

val a=Map(1->"<10",2->"<20")
val b=List((1,15),(2,15))

从b获取元组: 使用元组的第一个元素来查找地图,并比较第二个元素,如果它匹配则将其拾起:

e.g 对于(1,15)的元组,查找我们得到的地图&#34;&lt; 10&#34;,然后比较第二个元素15和&#34;&lt; 10&#34;,它失败了,所以扔这个元组消失了。 对于(2,15)的元组,我们将比较15与&#34;&lt; 20&#34;,它是正确的,所以保持(2,14)的元组。

scala是否可行?

2 个答案:

答案 0 :(得分:3)

"<10""<20"替换为函数:

val a = Map[Int, Int => Boolean](1 -> (_ < 10), 2 -> (_ < 20))

然后你可以这样做:

b filter { case (k, v) => a(k)(v) }

或等效地:

b filter Function.uncurried(a).tupled

答案 1 :(得分:3)

Scala既可编写脚本也可扩展。排序。

Welcome to Scala version 2.11.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val a=Map(1->"<10",2->"<20")
a: scala.collection.immutable.Map[Int,String] = Map(1 -> <10, 2 -> <20)

scala> val b=List((1,15),(2,15))
b: List[(Int, Int)] = List((1,15), (2,15))

scala> import javax.script._
import javax.script._

scala> new ScriptEngineManager().getEngineByName("scala")
res0: javax.script.ScriptEngine = scala.tools.nsc.interpreter.IMain@4ba302e0

scala> b filter { case (k, v) => (res0 eval s"$v${a(k)}").asInstanceOf[Boolean] }
res1: List[(Int, Int)] = List((2,15))