Умножьте каждый элемент класса generi c - PullRequest
2 голосов
/ 08 мая 2020

У меня есть общий 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, чтобы он работал таким образом?

1 Ответ

1 голос
/ 12 мая 2020

Я бы попробовал pattern matching с guard conditions, например:

def concat[A](a: Seq[A]) = {
    a match {
        case(h::_) if h.isInstanceOf[Int] => // do multiply and return as ....
        case(h::_) if h.isInstanceOf[String] => // do concat and return as ....
        case _ => throw new NoSuchElementException
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...