在Scala

时间:2016-10-16 05:18:46

标签: scala

我是Scala的新手,我正在尝试在scala中递归地构建一个数组列表,这里是我的代码,当我运行它时它不会抛出任何错误,但是,当我尝试unCons时它不会打印任何内容.foreach(的println)

val Tot = 5
val Num = 5

var unCons = ListBuffer[String]()

    for(j <- 1 to Tot)
      {
      var OurArr = ListBuffer[String]()

      for(i <- 1 to Num)
        {
          OurArr:+("true")
        }

      unCons:+(OurArr.toList)
 }

我期待的结果是这样的

[[true, true, true, true, true],
[true, true, true, true, true],
[true, true, true, true, true],
[true, true, true, true, true],
[true, true, true, true, true]]

任何想法,我哪里出错了?

3 个答案:

答案 0 :(得分:2)

“Scala方式”可能是使用List.fill

scala> List.fill(5)(List.fill(5)(true))
res0: List[List[Boolean]] = List(List(true, true, true, true, true), List(true, true, true, true, true), List(true, true, true, true, true), List(true, true, true, true, true), List(true, true, true, true, true))

答案 1 :(得分:1)

你有很多问题在继续。

首先,您未正确分配到ListBuffer

OurArr :+= "true"

接下来,您unCons的错误类型就是您要做的事情。

var unCons = ListBuffer[List[String]]()

在完成这些修复后,您将需要考虑良好的Scala实践,例如尽可能避免使用var(并且几乎总是可行)。

另一件事:此代码中没有递归。如果你试图递归地建立一个列表(正如问题标题所示),那么你需要一种完全不同的方法。

答案 2 :(得分:0)

  

任何想法,我哪里出错了?

您正在犯三个错误:

  1. unCons的类型为ListBuffer[String]OurArr也是ListBuffer[String]类型。您正尝试将集合OurArr添加到unCons,这会给您带来类型不匹配错误。当您尝试向其中添加unCons类型的元素时,String仅接受ListBuffer[String]类型的元素。因此,首先制作类型为ListBuffer [ListBuffer [String]]的unCons,以便它可以接受OurArr

    类型的元素
  2. 您正在使用:+方法将元素附加到OurArr集合OurArr:+("true"),该集合返回新集合,而不是编辑该集合。

    来自scaladoc:

  3.   

    def + :( elem:A):ListBuffer [A]   列表缓冲区的副本,前面有一个元素。

    在您的情况下,您应该使用OurArr += ("true")来编辑您的收藏品并且不会返回新的收藏品。

    你会猜测可变集合上的操作会在操作后返回相同的集合。但事实并非如此。可变集合上的许多操作返回集合的新副本,您将需要捕获该新集合。

    1. 此行:unCons:+(OurArr.toList)导致与上述#2相同的问题。 :+运算符返回一个新集合,并且您没有在变量中捕获该集合。相反,您可以使用unCons += OurArr来编辑集合。
    2. 最后但并非最不重要的是,您应该尽可能在Scala中避免使用VARS。你会很惊讶你很少需要在Scala中使用var。例如,在您的情况下:您使用了两个变量:

      var unCons = ListBuffer[String]()
      var OurArr = ListBuffer[String]()
      

      它们都可以是val,并且不会改变您的代码行为。请记住,当您将对象声明为val时,并不意味着您可以更改/编辑对象的内容。唯一的区别是您无法将指针更改为指向某个不同的内存地址。因此,在您的两种情况下,您都可以安全地使用val:

      所以你的代码变成了:

      val Tot = 5
      val Num = 5
      
        val unCons = ListBuffer[ListBuffer[String]]()
      
            for(j <- 1 to Tot)
              {
              val OurArr = ListBuffer[String]()
      
              for(i <- 1 to Num)
                {
                  OurArr += ("true")
                }
      
             unCons += OurArr
         }