scala打印字长直方图scala

标签 scala flatmap

我将一组行作为输入并跟踪字长的分布。输入中包括换行符在内的额外空白无关紧要。到达输入末尾后,输出是基于文本的字长分布直方图: 例如:“嘿,你好吗嘿,我很好”

输出: 1 - 0, 2 - 1, 3 - 5, 4 - 1, 5 - 0

其中(第一个字符是单词的长度,第二个是那个长度的单词的数量)。 我写了

val lines = scala.io.Source.stdin.getLines
val words = lines.flatMap(_.split("\\W+"))

我想将相同长度的单词分组,然后将它们存储在迭代器或映射中

val list2 = words.groupby(e.length => e.length).mapValues(_.length) 

没有给我想要的结果。 有什么建议吗?

最佳答案

你已经差不多明白了,但你需要 groupBy(e => e.length)。匿名函数(e => e.length)的左边(e),应该是一个变量名,将用于集合中的每一项(即, 每个字)。所以e是一个单词,我们根据单词的长度进行分组。

(另外,groupBy 有一个大写字母“B”)。

val list2 = words.groupBy(e => e.length).mapValues(_.length)

如果你想要你描述的输出,你可以跟进:

val vectorOfLengths = (1 to list2.keys.max).map(length => list2.getOrElse(length, 0))
// Vector(0, 1, 5, 1)
println(vectorOfLengths.zipWithIndex.map{case (count, length) => f"${length+1} - $count" }.mkString(", "))
// 1 - 0, 2 - 1, 3 - 5, 4 - 1

或者,嘿,视觉上怎么样?

for ((count, length) <- vectorOfLengths.zipWithIndex)
  println(f"${length+1}: ${"#" * count}")
//   1:
//   2: #
//   3: #####
//   4: #

只是为了好玩,Alice in Wonderland 的视觉直方图如何? ?

val aliceLines = io.Source.fromFile("/Users/dhg/texts/alice.txt").getLines.toVector
val aliceWords = aliceLines.flatMap(_.split("\\W+"))
val aliceHist = aliceWords.groupBy(_.length).mapValues(_.length)
val aliceLengths = (1 to aliceHist.keys.max).map(aliceHist.getOrElse(_, 0))
for ((count, length) <- aliceLengths.zipWithIndex)
  println(f"${length+1}%2s: ${"#" * (count/100)}")

//     1: ###################
//     2: ##################################################
//     3: ############################################################################
//     4: #############################################################
//     5: ###################################
//     6: ######################
//     7: ##################
//     8: ########
//     9: ######
//    10: ###
//    11: #
//    12:
//    13:
//    14:
//    15:
//    16:

关于scala打印字长直方图scala,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28153788/

相关文章:

Scala 隐式编译错误

Python:展平对象列表

scala - 在 future 序列中迭代 future 序列

scala - spark中 "grouped"的替代

scala - 结合 `OptionT` 和 `EitherT` 来处理 `Future[Either[Error, Option[T]]]`

Java - 将带有列表变量的对象转换为对象列表

java - Spark flatMap/减少 : How to scale and avoid OutOfMemory?

swift - 使用 flatMap 和 compactMap 得到不同的结果

scala - 是否有可以与组合器组合的最大数量的验证?

scala - 抽象类,为什么不能声明私有(private)的val和var类成员?