Преобразование массива [(Double, Double)] в Seq [Seq [Double]] - PullRequest
0 голосов
/ 19 декабря 2018

Я довольно новичок в Scala, и мне нужно использовать функцию, которая принимает в качестве аргумента тип Seq[Seq[Double]].Однако мои данные имеют тип Array[(Double,Double)].

. Я пытался использовать .toSeq для преобразования данных, но это не работает.

Любые исправления в этом отношении будут высоко оценены.,Спасибо!

1 Ответ

0 голосов
/ 19 декабря 2018
val input: Array[(Double, Double)] = ...
val output: Seq[Seq[Double]] = input.map { case (x, y) => Seq(x, y) }

К сожалению, в стандартной библиотеке нет общего способа безопасного преобразования типов в список в безопасном виде. shapeless , однако, обеспечивает эту функциональность:

import shapeless.syntax.std.tuple._

val input: Array[(Double, Double)] = ...
val output: Seq[Seq[Double]] = input.map(_.toList)

Shapeless достаточно умен, чтобы вычислить нижнюю верхнюю границу в случае, если ваш кортеж содержит компоненты разных типов:

val input: Array[(Double, Int)] = ...
// AnyVal is the closest type which both Double and Int are subtypes of
val output: Seq[Seq[AnyVal]] = input.map(_.toList)

Наконец, существует не типобезопасный способ сделать это, используя только стандартные инструменты библиотеки.Вы можете положиться на тот факт, что все кортежи в Scala реализуют черту Product и поэтому могут повторяться в виде коллекций Any:

val input: Array[(Double, Double)] = ...
val output: Seq[Seq[Double]] = input.map(_.productIterator.toSeq.asInstanceOf[Seq[Double]])

Это безопасно, пока выосторожно, но оно требует явного приведения и более многословно.

Если у вас есть кортежи фиксированной длины относительно небольшого размера, то я бы сказал, что лучше использовать подход на основе частичных функций.В противном случае это зависит от вас, но я бы использовал бесформенный, потому что он безопасен от типов, и я также использую бесформенный во многих своих проектах и ​​для других вещей, так что это для меня немного бесплатно:)

...