import scala.io.StdIn object ForDemo { def main(args: Array[String]): Unit = { // 请在 Begin-End 间编写代码 /********** Begin **********/ // 统计给定字符串中各单词出现的次数 val input = StdIn.readLine() val words = input.split("[^a-zA-Z]+").filter(word => word.nonEmpty) var wordCountMap = collection.mutable.Map[String, Int]().withDefaultValue(0) for (word <- words) { wordCountMap(word.toLowerCase()) += 1 } wordCountMap.toSeq.sorted.foreach { case (word, count) => println(s"单词: ${word}, 个数 ${count}") } /********** End **********/ } }
时间: 2025-05-08 12:20:18 浏览: 16
上述代码展示了一个简单的Scala程序,功能是从标准输入读取一行文本,并统计该行中每个单词出现的次数。下面是对你所提代码以及其功能的具体解析:
### 程序解释
1. **StdIn.readLine()**
- `import scala.io.StdIn` 引入了用于处理标准输入的功能模块。
- 使用 `val input = StdIn.readLine()` 可从控制台获取用户的一行输入。
2. **字符串分割与过滤**
- 对于读取到的内容 (`input`) ,首先通过正则表达式 `"[^a-zA-Z]+"` 进行切割,这将非字母字符作为分隔符。
```scala
val words = input.split("[^a-zA-Z]+")
```
- 随后使用 `.filter(word => word.nonEmpty)` 去掉空串结果,只保留有效的单词部分。
3. **构建词频表**
- 创建一个可变映射集合 `var wordCountMap = collection.mutable.Map[String, Int]()` 来存储每种单词及其对应的频率值,默认初始化所有未存在的键对应值为0.
- 利用循环对每一个分离出的单词进行小写转换并更新至map内:
```scala
for (word <- words) {
wordCountMap(word.toLowerCase()) += 1
}
```
4. **输出排序后的结果**
- 将生成的结果转成序列化形式(`toSeq`)再按字典顺序排列;
- 最终打印每一组包含单词及其次数的信息:
```scala
wordCountMap.toSeq.sorted.foreach { case (word, count) =>
println(s"单词: ${word}, 个数 ${count}")
}
```
---
### 示例运行过程
假设你输入的是以下句子:“Hello world! Hello”
那么最终会得到这样的输出内容:
```
单词: hello, 个数 2
单词: world, 个数 1
```
这是因为“hello”出现了两次,“world”仅一次;同时忽略大小写的差异统一记录下来。
---
阅读全文
相关推荐









