【问题标题】:Add List to ListBuffer with foreach使用 foreach 将列表添加到 ListBuffer
【发布时间】:2014-08-22 13:57:58
【问题描述】:

我正在使用 Mahout FPGrowth 算法,但坚持对数据进行预处理。

FPGrowth 算法的输入为: val 数据:List[JPair[JList[String], JLong]]

在我工作的早期阶段,我使用硬编码的输入数据对其进行了测试。

val data: List[JPair[JList[String], JLong]] = List(
  new JPair(List("bread", "beer", "fries", "butter"), 1L),
  new JPair(List("milk", "bread"), 1L),
  new JPair(List("butter", "beer", "fries"), 1L),
  new JPair(List("bread", "beer"), 1L),
  new JPair(List("milk", "butter", "bread", "beer"), 1L)
)

那行得通。但我想自动填写列表。我在 scala 中读到,这可以通过 ListBuffers 实现。我试图在 foreach 步骤中填充 ListBuffer。但这不起作用。

parsedData.foreach( p =>  ListBuf += new JPair(p.str, 1L) )
val ItemSet = ListBuf.toList

在应用程序的末尾,列表 (ItemSet) 仍然是空的。

有人有想法吗??

【问题讨论】:

    标签: scala apache-spark scala-collections


    【解决方案1】:

    如果没有看到初始化 ListBuf 的代码,这有点难以分辨,但我建议您使用一种更好的方法,它不涉及可变集合。

    您想通过对parsedData 的每个元素应用转换来生成一个新集合,而这正是map 所做的。这是一个例子

    val data = parsedData.map(new JPair(JString(_.str), JLong(1L)))
    

    我明确使用了JStringJLong 构造函数,这样您就不必对类型进行注释。

    【讨论】:

    • 嗨,Gabriele,感谢您的回复。 ListBuffer 的初始化是 var ListBuf = ListBuffer[JPair[JList[String], JLong]]()。如果我使用 ListBuf += new JPair(List("test", "test2"), 1L) 向 ListBuf 添加一个元素,它会起作用。您对我以类似方式尝试的地图的建议,但给出了以下错误:-对象 java.lang.Long 不是值-扩展函数缺少参数类型 ((x$2) => x$2.str)跨度>
    • 编辑:如果使用 var data:List[JPair[JList[String], JLong]] = parsedData.map(c => new JPair(c.str, 1L)) 我得到:-类型不匹配;找到:org.apache.spark.rdd.RDD[org.apache.mahout.common.Pair[List[String],scala.Long]] 需要:List[org.apache.mahout.common.Pair[java.util. List[String],java.lang.Long]] - 类型不匹配;找到: Array[org.apache.mahout.common.Pair[scala.collection.immutable.List[String],scala.Long]] 需要: scala.collection.immutable.List[org.apache.mahout.common.Pair[ java.util.List[String],java.lang.Long]]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多