我可以编写一个返回n元组的scala函数,其中n由参数定义吗?

时间:2015-02-02 20:21:21

标签: scala

我正在尝试编写一个scala函数,可以从推文中生成n-gram。

该函数将采用两个参数,首先是字符串列表(我们要检查的推文)和一个整数n。如果我们将n设置为2(默认值),那么函数的结果将是2元组的HashMultiset,同样如果我们将其设置为3则结果将是3元组的HashMultiset。

有没有办法定义这样的功能?我想明确我的输入,所以我不想将函数定义为返回Any的MultiSet。

这是我到目前为止的存根函数,它仅适用于n == 2:

def extract_ngrams(tweets:List[String], n:Int=2):HashMultiset[(String,String)] = {
val result = HashMultiset.create[(String,String)]()
result.add(("a", "a"))
result
}

3 个答案:

答案 0 :(得分:6)

Scala中的元组最多只有22个。所以即使有可能它只允许n值为2..22。

我只需返回HashMultiset[Array[String]],您就可以使用n来定义结果: val result = HashMultiset[Array[String]].create()

然后,您可以根据需要使用map it to tuples

更新

如果我理解你需要什么,我会做类似

的事情
def extract_ngrams(tweets:List[String], n:Int=2):Map[List[String],Int] = {
   tweets.sliding(n).toList.groupBy(_.toList).mapValues(_.length)
}

答案 1 :(得分:5)

本机Scala库无法实现这一点。如果此功能对您很重要,您可以使用shapeless之类的内容。

您所描述的元组的常见超类型为Product with Serializable,因此如果您愿意,可以返回HashMultiset[Product with Serializable],但您可能更好地返回{{} {1}}或HashMultiset[Seq[String]]HashMultiset[Map[Int, String]]

答案 2 :(得分:1)

我建议元组可能是错误的数据结构。案例类可以解决这个问题:

case class Data(v: String*)

def makeData(v: String*) = {
  Data(v: _*)
}

val s = Set[Data]()

s += makeData("a", "b")
s += makeData("c", "d", "e")

for(i <- s) i match {
  case Data(v @ _*) => println(v)
}