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) } 理解能力更容易阅读,而且已经有一个预定义的函数标识,它是你自己的一般化版本. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |