将元素追加到scala中的列表列表
我创建了一个空的scala可变列表将元素追加到scala中的列表列表,scala,scala-collections,Scala,Scala Collections,我创建了一个空的scala可变列表 import scala.collection.mutable.ListBuffer val list_of_list : List[List[String]] = List.empty 我想如下所示将元素附加到它 filtered_df.collect.map( r => { val val_list = List(r(0).toString,r(4).toString,r(5).toString)
import scala.collection.mutable.ListBuffer
val list_of_list : List[List[String]] = List.empty
我想如下所示将元素附加到它
filtered_df.collect.map(
r => {
val val_list = List(r(0).toString,r(4).toString,r(5).toString)
list_of_list += val_list
}
)
我得到的错误是
Error:(113, 26) value += is not a member of List[List[String]]
Expression does not convert to assignment because receiver is not assignable.
list_of_list += val_list
有人能帮忙吗您必须将
val list\u of_list
更改为var list\u of_list
。仅此一项是不够的,因为您还必须将列表的类型更改为可更改的替代项。您的声明似乎是错误的:
val list_of_list : List[List[String]] = List.empty
表示您已声明了scala.collection.immutable.List
,其操作将返回一个新列表,而不更改当前列表
要修复此错误,您需要将在声明上方导入的外部列表
类型更改为列表缓冲区
,如下所示:
val list_of_list : ListBuffer[List[String]] = ListBuffer.empty
val list_of_list: List[List[String]] =
filtered_df.collect.toList
.foldRight(List.empty[List[String]])((r, acc) => List(r(0).toString,r(4).toString,r(5).toString) :: acc)
此外,除非您想修改从
DataFrame
收集的数据,否则这里似乎不需要使用map
,因此您可以将其更改为foreach
:
filtered_df.collect.foreach {
r => {
val val_list = List(r(0).toString,r(4).toString,r(5).toString)
list_of_list += val_list
}
}
此外,通过使用不可变的
List
和foldRight
,您可以在不使用ListBuffer
的情况下以功能性的方式创建它,如下所示:
val list_of_list : ListBuffer[List[String]] = ListBuffer.empty
val list_of_list: List[List[String]] =
filtered_df.collect.toList
.foldRight(List.empty[List[String]])((r, acc) => List(r(0).toString,r(4).toString,r(5).toString) :: acc)
toList
用于在调用foldRight
时实现堆栈安全
您必须将
val list\u of_list
更改为var list\u of_list
,还必须将list\u of_list
的类型更改为可变的可选类型不幸的是foldRight
不是堆栈安全的,我更喜欢foldLeft
而不是foldRight
,foldLeft
是堆栈safe@BorisAzanov你说得对。它仅对不可变的列表
是堆栈安全的。编辑了答案