获取List [Option [Int或Long或Float]]中的最小值和最大值

时间:2015-05-12 14:50:13

标签: scala

我正在尝试在有序数字列表中获取最小值和最大值。 使用特定类型时没有问题:

v2

但是当我找不到改变它的方式也接受Long和Float时,我试过了:

private def minMaxValue (valuesList: List[Option[Int]], min: Boolean): Option[Int] = 
  valuesList.flatten match {
  case Nil => None
  case xs => Some(if (min) xs.min else xs.max)
}

但它不起作用,我收到

的警告
  
      
  • 类型模式中的非变量类型参数Int List [Int](List [Int]的基础)未被选中,因为它被消除了    擦除
  •   

在scala中解决此问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

我会这样做:

def minMaxValue[T <% Ordered[T]](valuesList: List[Option[T]], min: Boolean): Option[T] = 
  valuesList.flatten match {
    case Nil => None
    case xs => Some(if (min) xs.min else xs.max)
  }

这将创建一个带有类型参数T的通用函数。您必须声明T是有序类型,因此编译器可以证明T的集合具有minmax方法。

它适用于整数和双打:

scala> minMaxValue(List(Option(1), None, Option(3)), false)
res7: Option[Int] = Some(3)

scala> minMaxValue(List(Option(1.0), None, Option(3.0)), false)
res8: Option[Double] = Some(3.0)

scala> minMaxValue(List(Option(1.0), None, Option(3.0)), true)
res9: Option[Double] = Some(1.0)

JVM中具有类型擦除的东西是类型参数仅在编译时可用,但在运行时不可用。在我的解决方案中,编译器会看到类型T,并且可以使用该信息进行类型检查,并生成适用于您正在使用的T的特定值的函数。在您的代码中,您需要在运行时判断某些内容是List[Int]还是List[Long],但那时该信息已被删除。

答案 1 :(得分:0)

我会将List[Option[Int]]转换为List[Int],以便能够使用maxmin方法。

val listOpt = List(Some(3), None, Some(7))

val listValues = listOpt.collect{
  case Some(x) => x
}

listValues.max
listValues.min