Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:将嵌套值类转换为向量_Scala - Fatal编程技术网

Scala:将嵌套值类转换为向量

Scala:将嵌套值类转换为向量,scala,Scala,我有一些类型安全的案例类,我想把它们转换成向量: case class Bdrms(underlying: Double) extends AnyVal object Bdrms { implicit def toBdrm(x: Double): Bdrms = Bdrms(x) } case class Bath(underlying: Double) extends AnyVal object Bath { implicit def toBath(x: Double): Ba

我有一些类型安全的案例类,我想把它们转换成向量:

case class Bdrms(underlying: Double) extends AnyVal
object Bdrms {
    implicit def toBdrm(x: Double): Bdrms = Bdrms(x)
}
case class Bath(underlying: Double) extends AnyVal
object Bath {
    implicit def toBath(x: Double): Bath = Bath(x)
}
// same pattern for many (20-30) other variables. sq ft, price, etc.
// and a parent case class

case class RealEstateDataPoint(bdrm: Bdrm, bath: Bath, sqft: Sqft,//)
def toVector(dataCC: RealEstateDataPoint): Vector[Double] = {
    val m = dataCC.productArity
    val vector = Vector(m)
    for (i<-0 until m) {
        vector(i) = dataCC.productElement(i).asInstanceOf[Double]
    }
    vector
}
一个服务需要以
向量的形式使用这些
双倍
。如果没有使用值类,即如果我们
案例类RealEstateDatePoint(bdrm:Double,bath:Double…)
然后,类似于以下的操作可以在字段上迭代以创建向量:

case class Bdrms(underlying: Double) extends AnyVal
object Bdrms {
    implicit def toBdrm(x: Double): Bdrms = Bdrms(x)
}
case class Bath(underlying: Double) extends AnyVal
object Bath {
    implicit def toBath(x: Double): Bath = Bath(x)
}
// same pattern for many (20-30) other variables. sq ft, price, etc.
// and a parent case class

case class RealEstateDataPoint(bdrm: Bdrm, bath: Bath, sqft: Sqft,//)
def toVector(dataCC: RealEstateDataPoint): Vector[Double] = {
    val m = dataCC.productArity
    val vector = Vector(m)
    for (i<-0 until m) {
        vector(i) = dataCC.productElement(i).asInstanceOf[Double]
    }
    vector
}
def-toVector(dataCC:RealEstateDataPoint):向量[Double]={
val m=dataCC.productArity
val向量=向量(m)

对于(i您可以使用结构类型:

dataCC.productIterator.map {
    case h:{ val underlying: Double } => h.underlying 
}.toVector

你也可以考虑让所有的case类继承一个特性:

trait HasUnderlying { val underlying: Double }
case class Bdrms(val underlying: Double) extends HasUnderlying
然后可以得到所需的向量,如下所示:

dataCC.productIterator.map { 
    case h: HasUnderlying => h.underlying 
}.toVector

可以使用结构类型:

dataCC.productIterator.map {
    case h:{ val underlying: Double } => h.underlying 
}.toVector

你也可以考虑让所有的case类继承一个特性:

trait HasUnderlying { val underlying: Double }
case class Bdrms(val underlying: Double) extends HasUnderlying
然后可以得到所需的向量,如下所示:

dataCC.productIterator.map { 
    case h: HasUnderlying => h.underlying 
}.toVector


什么是
productArity
productElement
?为什么
Vector
?你可以用一个普通的超类型来实现这一点,但它不会更安全。这个问题似乎更多地表明设计不好。线性代数库使用向量,而不是类。我喜欢你选择的答案,但我确实制定了一个要点,支持你的不动产带有映射的数据类型。不确定它是否对您有任何实用性,但我想我会提供一个链接:什么是
产品性
产品元素
?为什么
向量
?您可以用普通的超类型来实现这一点,但它不会更安全。这个问题似乎更表明设计不好。线性代数库使用向量,而不是类。我喜欢你选择的答案,但我确实找到了一个要点,我用地图支持了你的房地产数据类型。不确定它是否对你有用,但我想我会提供一个链接:你必须小心不要使用
产品
,它包含的东西肯定不是
基础的
@m-z。我同意您在上面的评论中指出,这可能是糟糕代码设计的象征,除非是在特殊情况下,因为这可能会出现愚蠢的错误(例如,错误命名
基础变量)和运行时(而不是编译时)错误。这就是为什么我在设计之前问这个问题:)。我的想法很简单,我正在围绕akka集群传递案例类,在某个时刻,我需要从案例类的字段构造一个密集向量(对于Breeze)。案例类是通过数据存储查询和其他http服务构造的。此外,我也不确定回答“似乎是糟糕的代码设计”的问题帮助任何人;)我不认为这一定是糟糕的代码设计。我认为它需要特定的环境。在我看来,需要从数据存储读取的案例类中获得一个密集的breeze向量似乎是合适的:)然后必须小心不要使用
产品
,它包含的东西肯定不是
底层的
@m-z请注意上面的评论,这可能是糟糕代码设计的象征,除非在特殊情况下,因为这可能会出现愚蠢的错误(例如,错误命名
基础变量)和运行时(而不是编译时)错误这就是为什么我在设计之前要问这个问题:)。我的想法很简单,我正在围绕akka集群传递case类,在某个点上,我需要构造一个稠密向量(对于Breeze)从案例类的字段。案例类是通过数据存储查询和其他http服务构建的。此外,不确定回答“似乎是糟糕的代码设计”的问题帮助任何人;)我不认为这一定是糟糕的代码设计。我认为它需要特定的环境。在我看来,需要从通过数据存储读取的案例类中为breeze提供一个密集的向量似乎符合条件:)