使用scala,我可以取消应用元组,然后在其上运行映射吗?

使用scala,我可以取消应用元组,然后在其上运行映射吗?,scala,tuples,Scala,Tuples,我在一个列表[(Int,Double)]中收集了一些财务数据,如下所示: val snp = List((2001, -13.0), (2002, -23.4)) case class EiulLimits(lower:Double, upper:Double) def eiul(xs: Seq[(Int, Double)], limits:EiulLimits): Seq[(Int, Double)] = { xs.map(item => (item._1,

我在一个列表[(Int,Double)]中收集了一些财务数据,如下所示:

val snp = List((2001, -13.0), (2002, -23.4))
case class EiulLimits(lower:Double, upper:Double)
def eiul(xs: Seq[(Int, Double)], limits:EiulLimits): Seq[(Int, Double)] = {
    xs.map(item => (item._1, 
                    if (item._2 < limits.lower) limits.lower 
                    else if (item._2 > limits.upper) limits.upper 
                         else item._2
}
基于此,我编写了一个公式,通过map将列表转换为另一个列表(以演示投资级人寿保险),其中0以下的损失转换为0,15以上的收益转换为15,如下所示:

val snp = List((2001, -13.0), (2002, -23.4))
case class EiulLimits(lower:Double, upper:Double)
def eiul(xs: Seq[(Int, Double)], limits:EiulLimits): Seq[(Int, Double)] = {
    xs.map(item => (item._1, 
                    if (item._2 < limits.lower) limits.lower 
                    else if (item._2 > limits.upper) limits.upper 
                         else item._2
}
案例类EiulLimits(下限:双精度,上限:双精度)
定义eiul(xs:Seq[(整数,双精度)],限制:EiulLimits):Seq[(整数,双精度)]={
xs.map(项目=>(项目1,
如果(项目2<限值.下限)限值.下限
如果(项目2>限制。上限)限制。上限
其他项目
}
这里面有没有提取元组值的方法,这样我就不必使用笨重的1和2符号了

List((1,2),(3,4)).map { case (a,b) => ... }
case
关键字调用模式匹配/取消应用逻辑

注意
map


以及较慢但较短的代码快速重写:

case class EiulLimits(lower: Double, upper: Double) { 
  def apply(x: Double) = List(x, lower, upper).sorted.apply(1)
}

def eiul(xs: Seq[(Int, Double)], limits: EiulLimits) = {
  xs.map { case (a,b) => (a, limits(b)) } 
}
用法:

scala> eiul(List((1, 1.), (3, 3.), (4, 4.), (9, 9.)), EiulLimits(3., 7.))
res7: Seq[(Int, Double)] = List((1,3.0), (3,3.0), (4,4.0), (7,7.0), (9,7.0))

太好了!我也喜欢你对EiulLimits的排序。将正确答案排序到中间。:)为了好玩,你可以在上看到我的整个项目。我的下一步是使用滑动函数,每隔10年、15年和20年评估一次,以显示标准普尔的整体表现有多大的差异。谁说scala只用于DNA和其他科学研究?这是关于如何绘制地图的好答案,但你确实意识到你只是减慢了cod的速度通过创建一个列表并进行排序来绑定一个值,是吗?@Rex是的,我知道这要慢一些(尽管这是否重要完全取决于使用情况).但他已经知道了快速解决方案,所以我想指出一种简单的方法可能会很有趣。但是你没有事先警告就这么做了。我认为向某人展示其他方法来构造代码是很好的,但是如果它要慢一个数量级(或者从O(n log n)变为O(n^2)或类似的东西),发出警告通常很好。
:6:error:“)”应为“”,但找到了“}”。
(最后一个大括号)
case-Class-EiulLimits(lower:Double,upper:Double){def-apply(d:Double)=math.min(upper,math.max(lower,d))}
是您的朋友。