n克scala输出集转换

时间:2015-05-13 13:21:50

标签: scala set n-gram

def ngrams(n: Int, words: Array[String]) = {
// exclude 1-grams
(1 to n).map { i => words.sliding(i).toStream }
  .foldLeft(Stream[Array[String]]()) {
    (a, b) => a #::: b
  } }   
scala> val op2 =  ngrams(3, "how are you".split(" ")).foreach { x => println((x.mkString(" ")))}  
Output as :    
how
are
you
how are
are you
how are you
op2: Unit = ()

如何避免上述 单位 值,实际上我想将它们转换为Set,因为Unit =(),它失败了。那么请你帮忙输出 设置(你怎么样,你,你是怎么样,你是怎么样的) 感谢帖子How to generate n-grams in scala?

2 个答案:

答案 0 :(得分:2)

简短回答是foreach的返回类型为Unit。因此,当您将foreach的输出分配到op2时,op2的类型为Unit,其值为()

听起来你想要做的是以下几点:

  1. 使用ngrams方法计算n-gram,
  2. 将{-1}}个n-gram存储到Set
  3. 打印出所有的n-gram。
  4. 让我们从op2方法的类型开始:

    ngrams

    它返回(n: Int, words: Array[String]) => Stream[Array[String]] ,看起来很容易变成Stream Set

    toSet

    但是,这很危险,因为在scala中,ngrams(3, "how are you".split(" ")).toSet相等是通过引用完成的。将Array转换为Stream[Array[String]]以便删除任何重复内容会更加安全(假设订单在每个ngram中都很重要):

    Stream[List[String]]

    现在,您可以像val op2 = ngrams(3, "how are you".split(" ")).map(_.toList).toSet一样轻松打印Set[List[String]]

    Stream[Array[String]]

    由于结果为op2.foreach { x => println((x.mkString(" ")))} ()类型,因此没有理由将其分配给变量。

答案 1 :(得分:0)

它是op2的类型签名。你可以做到

  1. 删除对Op2的分配
  2. ngrams(3, "how are you".split(" ")).foreach { x => println((x.mkString(" ")))}

    1. .foreach更改为.map,并将结果调用op2
    2. scala> val op2 = ngrams(3, "how are you".split(" ")).map { x => x.mkString(" ")}.toList

      scala> op2