替换第一个scala的第二个参数

时间:2017-12-04 00:16:45

标签: arrays scala function multidimensional-array

我正在尝试在scala(^)中定义一个函数,该函数接受2个值并将其打印为

 2
x

这是我到目前为止所拥有的......

class $ (val text2D: Array[Array[Char]])
{
  def ^(that: $) =
  {
    " " ++ s"${this.text2D(0)(0)}" ++
    "\n" ++ s"${that.text2D(0)(0)}"
  }

  def +(that: $) = this.text2D + "+" + that.text2D

  override def toString = s"${this.text2D(0)(0)}"
}

object $ {
  val array = Array.ofDim[Char](1,1)
  def apply(x: String): $ = {
    array (0)(0) = x.charAt(0)
    new $ (array)
  }
}

val x = $("x")
println(x)

val x2 = $("x") ^ $("2")
println(x2)

当我运行时,我没有得到我期望的输出,而是得到

 2
2

为什么只采取第二个元素?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

object创建一个单例,因此您使用的(可变)数组在对apply的调用之间共享。您需要在<{1}}调用中分配该数组

apply

另外,稍微不相关,但我相信你的论点落后了。要获得所需的输出,您需要

def apply(x: String): $ = {
  val array = Array.ofDim[Char](1,1)
  array (0)(0) = x.charAt(0)
  new $ (array)
}

答案 1 :(得分:0)

我认为你需要的是这样的:

class $(val text2D: Array[String]) {
  def ^(that: $): $ = {
    if (this.text2D.length == 0)
      that
    else if (that.text2D.length == 0)
      this
    else {
      val thisW = this.text2D(0).length
      val thatW = that.text2D(0).length

      // cross-pad arrays to have the same width
      val padThisRight = " " * thatW
      val padThatLeft = " " * thisW
      val thisPaddedW = this.text2D.map(_ + padThisRight)
      val thatPaddedW = that.text2D.map(padThatLeft + _)
      // first lines comes from that!
      new $(thatPaddedW ++ thisPaddedW)
    }
  }

  def +(that: $): $ = {
    if (this.text2D.length == 0)
      that
    else if (that.text2D.length == 0)
      this
    else {
      val thisH = this.text2D.length
      val thatH = that.text2D.length
      val thisW = this.text2D(0).length
      val thatW = that.text2D(0).length

      // pad arrays to have the same height
      val emptyThis = " " * thisW
      val emptyThat = " " * thatW
      val thisPaddedH = if (thisH >= thatH) this.text2D else Array.fill(thatH - thisH)(emptyThis) ++ this.text2D
      val thatPaddedH = if (thisH <= thatH) that.text2D else Array.fill(thisH - thatH)(emptyThat) ++ that.text2D

      new $(thisPaddedH.zip(thatPaddedH).map(p => p._1 + p._2))
    }
  }

  override def toString = text2D.mkString("\n")
}

object $ {
  def apply(x: String): $ = {
    new $(Array[String](x))
  }
}

然后

val x2 = $("x") ^ $("2")
println(s"x2:\n$x2")
println("----------------------------")

val z = x2 + $(" + ") + y2
println(s"z:\n$z")
println("----------------------------")

val zz = x2 + $(" + ") + (y2 ^ $("3"))
println(s"zz:\n$zz")
println("----------------------------")

产生以下输出

x2:
 2
x 
----------------------------
z:
 2    2
x  + y 
----------------------------
zz:
       3
 2    2 
x  + y  
----------------------------

此处的主要想法是$上的操作会产生$而不是String的另一个实例(我使用String代替Array[Char]更容易,没有明显的缺点)。通过这种方式,您不必重新解析String按新行拆分它,并且不得不想知道如何在字符串未对齐时处理案例。所以现在运算符^+只是将两个2d数组对齐以具有相同宽度或相同高度然后加入它们的练习。