Scala中的地图和平面图

时间:2018-08-16 18:05:49

标签: scala

我是scala的新手。在使用元组的地图和平面地图时,我需要很多帮助。

我具有以下功能-

    def extract(url: String): String = {//some code}
    def splitstring(content: String): Array[String]={//some code}
    def SentenceDetect(paragraph: Array[String]): Array[String] = {//some code}
    def getMd5(literal: String): String = {//some code}

我有一个传入的URL列表。我希望它能够使用地图和平面图来完成上述一系列功能。

    var extracted_content=url_list.map(url => (url,extract(url)))

    val trimmed_content=extracted_content.map(t => (t._1,splitstring(t._2)))

    val sentences=trimmed_content.map(t => (t._1,SentenceDetect(t._2)))

    val hashed_values=sentences.flatMap(t => (t._1,getMd5(t._2)))

问题是由于类型不匹配,flatMap出现了错误-

Error:(68, 46) type mismatch;
  found   : (String, String)
  required: scala.collection.GenTraversableOnce[?]
val hashed_values=sentences.flatMap(t => (t._1,getMd5(t._2.toString)))

如何完成它。

2 个答案:

答案 0 :(得分:1)

我想这就是你的追求。

val hashed_values = sentences.map(t => (t._1, t._2.map(getMd5)))

这应该导致类型为List[(String,Array[String])]。假设您实际上需要t._2数组中每个元素的Md5计算。

回想一下flatMap()的签名是flatMap(f: (A) ⇒ GenTraversableOnce[B]),换句话说,它采用一个函数,该函数采用一个元素并返回过渡元素的集合。元组(String,String)不是GenTraversableOnce,因此您将得到错误。

答案 1 :(得分:-2)

由于getMd5(...)接受字符串,但是sentences的类型为List[(String, Array[String])](假设url_listList[String]),因此出现{{{ 1}}的类型为t._2

无论如何,关于您的代码的一些注意事项:

  1. scala中的变量名称是“较低的骆驼”(https://docs.scala-lang.org/style/naming-conventions.html),而不是带下划线的较低
  2. Array[String]应该是extracted_content
  3. 由于所有变量都是地图,并且由于要转换地图的值,因此最好使用val而不是.mapValues