У меня есть общий c класс, содержащий список типа T, и у меня есть метод concat, который объединяет два объекта и возвращает новый. Мне нужно, чтобы он объединял два списка, но если тип списка Int, Double или Float, он должен умножать каждый элемент списка на результат удовольствия c
class Seq[T : Ordering] (initialElems: T*)(implicit toStr: ToStr[T]) {
override def toString: String = toStr(fac(factors), elems: _*)
val elems = initialElems.sorted
def concat(a:Seq[T]) = new Seq(a.elems ++ this.elems:_*)
val factors = ListBuffer[Int](1)
def fac(xs: ListBuffer[Int]): Int = {
var i=0
var sum = 1
while (i < xs.length) {
sum *= xs(i)
i += 1
}
sum
}
def multy(a: Int)(implicit ev: T <:< AnyVal): Unit = {
factors += a
}
}
trait ToStr[T] {
def apply(fac: Int, elems: T*): String
}
object ToStr {
implicit val int: ToStr[Int] =
(fac, elems) => elems.map((i: Int) => fac * i).toString
implicit val double: ToStr[Double] =
(fac, elems) => elems.map((i: Double) => fac * i).toString
implicit val float: ToStr[Float] =
(fac, elems) => elems.map((i: Float) => fac * i).toString
implicit val str: ToStr[String] = (_, elems) => elems.toString
}
Например, я создаю два списка
val numbers1 = new Seq(1,5,4,2)
val numbers2 = new Seq(7,8,11,17)
, чем я добавляю коэффициенты к
number1: numbers1.multy(5)
numbers1.multy(3)
И коэффициент к
number2: numbers2.multy(10)
И после того, как я конкатенирую number = number1.concat(numbers2)
, я ожидаю получить числа, содержащие (1*3*5, 5*3*5, 4*3*5, 2*3*5, 7*10, 8*10, 11*10, 17*10)
(А после сортировки будет) ->
(15, 30, 60, 70, 75, 80, 110, 170)
А если список строк, то не надо умножать, а просто конкатенировать. Например,
strings1 = new Seq("b", "e", "f")
strings2 = new Seq("c", "a")
strings = strings1.concat(strings2)
строки будут ("a", "b", "c", "e", "f")
Как я могу изменить метод concat, чтобы он работал таким образом?