我是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]]
任何想法,我哪里出错了?
答案 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)
任何想法,我哪里出错了?
您正在犯三个错误:
unCons
的类型为ListBuffer[String]
。 OurArr
也是ListBuffer[String]
类型。您正尝试将集合OurArr
添加到unCons
,这会给您带来类型不匹配错误。当您尝试向其中添加unCons
类型的元素时,String
仅接受ListBuffer[String]
类型的元素。因此,首先制作类型为ListBuffer [ListBuffer [String]]的unCons,以便它可以接受OurArr
您正在使用:+方法将元素附加到OurArr集合OurArr:+("true")
,该集合返回新集合,而不是编辑该集合。
来自scaladoc:
def + :( elem:A):ListBuffer [A] 列表缓冲区的副本,前面有一个元素。
在您的情况下,您应该使用OurArr += ("true")
来编辑您的收藏品并且不会返回新的收藏品。
你会猜测可变集合上的操作会在操作后返回相同的集合。但事实并非如此。可变集合上的许多操作返回集合的新副本,您将需要捕获该新集合。
unCons:+(OurArr.toList)
导致与上述#2相同的问题。 :+运算符返回一个新集合,并且您没有在变量中捕获该集合。相反,您可以使用unCons += OurArr
来编辑集合。最后但并非最不重要的是,您应该尽可能在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
}