加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala:列表元素的groupBy(identity)

发布时间:2020-12-16 21:34:06 所属栏目:安全 来源:网络整理
导读:我开发一个在(令牌化)文本中构建单词对的应用程序,并产生每一对出现的次数(即使相同字对发生多次,也可以在算法的后面加以说明). 当我使用 elements groupBy() 我想通过元素的内容本身进行分组,所以我写了以下内容: def self(x: (String,String)) = x/** * M
我开发一个在(令牌化)文本中构建单词对的应用程序,并产生每一对出现的次数(即使相同字对发生多次,也可以在算法的后面加以说明).

当我使用

elements groupBy()

我想通过元素的内容本身进行分组,所以我写了以下内容:

def self(x: (String,String)) = x

/**
 * Maps a collection of words to a map where key is a pair of words and the 
 *  value is number of
 * times this pair
 * occurs in the passed array
 */
def producePairs(words: Array[String]): Map[(String,String),Double] = {
  var table = List[(String,String)]()
  words.foreach(w1 =>
    words.foreach(w2 =>
      table = table ::: List((w1,w2))))


  val grouppedPairs = table.groupBy(self)
  val size = int2double(grouppedPairs.size)
  return grouppedPairs.mapValues(_.length / size)
}

现在,我完全意识到这个self()技巧是一个肮脏的黑客.所以我以为有一点出来了:

grouppedPairs = table groupBy (x => x)

这样就产生了我想要的东西.但是,我仍然觉得我清楚地想念某事,应该有更简单的方法.有什么想法,亲爱的吗?

另外,如果你帮助我改进配对提取部分,那么它也会有很大的帮助 – 现在看起来很重要,C – ish.提前谢谢了!

解决方法

我建议这样:

def producePairs(words: Array[String]): Map[(String,Double] = {
    val table = for(w1 <- words; w2 <- words) yield (w1,w2)
    val grouppedPairs = table.groupBy(identity)
    val size = grouppedPairs.size.toDouble
    grouppedPairs.mapValues(_.length / size)
}

理解能力更容易阅读,而且已经有一个预定义的函数标识,它是你自己的一般化版本.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读