主方法中的默认参数,并在Scala中打印地图

时间:2015-05-24 01:45:41

标签: scala

此程序打印一个最大为给定数字的阶乘表。给定数字10,输出将如下:

1 != 1
2 != 2
3 != 6
4 != 24
5 != 120
6 != 720
7 != 5040
8 != 40320
9 != 362880
10!= 3628800

这是我的尝试:(其中有错误)

package nick
import Factorial.factorial
import scala.collection.immutable.TreeMap

object PPrintFactorial {
  def main(args: Array[String] = Array("12")) {
    //    if (args.length > 0)
    val listNum = 1 to args(1).toInt
    val listFac = listNum.map(factorial)
    val numFacPair = TreeMap((listNum zip listFac): _*)
    var padding: String = " "
    //    for (sp <- listNum)
    //      padding = " " * (10 - sp.toString.length)  
    for ((k, v) <- numFacPair) println(k + padding + " ! = " + v)
  }
}

问题:

  1. 主方法中是否允许使用默认参数?如果是,请如何设置?
  2. 打印地图时如何调整填充?正如您在代码的注释部分中看到的那样,我无法正确添加填充。
  3. 修改

    格式化问题:

    !10!= 3628800前面的空格比其他人多一个。如果输入的数字是三位数,则100 !=行前面会有两个空格。也就是说,!不是垂直对齐的。

3 个答案:

答案 0 :(得分:1)

对于填充,您可以考虑使用制表符而不是空格来以非常方便的方式解决问题吗?

scala> println("1\t== x")
1    == x

scala> println("10\t== x")
10   == x

scala> println("100\t== x")
100  == x

scala> println("1000\t== x")
1000 == x

答案 1 :(得分:0)

main方法允许使用默认参数,但不能使用它们。当您使用java ...运行类的main方法时,Java 传递一个参数,该参数是一个包含所有参数的数组。

如果未提供参数,Java仍会传递参数。该数组将为空,但它仍然是一个参数。

即使不是这样,Java也不了解Scala默认值 - 这是Scala编译器在代码中插入的东西,所以它根本不会发生。

关于格式化,你没有解释它的错误。

答案 2 :(得分:0)

对于参数的默认值,只需检查args数组是否为空。如果为空,则将其默认为所需的值。这应该做:

val limitValue = (if (args.isEmpty) "12" else args(0)).toInt
val listNum = 1 to limitValue

对于填充,您可以尝试这样的事情:

val maxLength = listNum.last.toString.length // assuming listNum has last() method

for ((k, v) <- numFacPair) {
  val padding = (k.toString.length - maxLength).abs
  println(k + (padding * " ") + " ! = " + v)
}

请注意,每次都会计算填充。 listNum中的最后一个元素将是您的最大值(因此最长),k - 当前元素 - 和maxLength的长度之间的差异将是填充值。然后使用字符串乘法padding * " "获得那么多空格。

我希望我理解正确,希望这有效。