斯卡拉印刷字长直方图斯卡拉

Pro*_*mer 2 scala flatmap

我将输入一组行作为输入并跟踪字长的分布.额外的空白区域(包括输入中的换行符)无关紧要.在输入结束后,输出是基于文本的字长分布直方图:例如:"嘿,你好,你好"

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

where(第一个字符是单词的长度,第二个字符是该长度的单词).我已经写了

val lines = scala.io.Source.stdin.getLines
val words = lines.flatMap(_.split("\\W+"))
Run Code Online (Sandbox Code Playgroud)

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

val list2 = words.groupby(e.length => e.length).mapValues(_.length) 
Run Code Online (Sandbox Code Playgroud)

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

dhg*_*dhg 6

你已经得到了它,但是你需要它groupBy(e => e.length).e匿名函数(e => e.length)的左侧()应该是一个变量名,它将用于集合中的每个项目(即每个单词).这e是一个词,我们根据词的长度分组.

(另外,groupBy有一个大写"B").

val list2 = words.groupBy(e => e.length).mapValues(_.length)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

或者,嘿,视觉怎么样?

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

只是为了好玩,爱丽丝梦游仙境的视觉直方图怎么样?

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:
Run Code Online (Sandbox Code Playgroud)