Scala列表处理报错:无法获取每行rr元素,求代码修正方案
解决Scala代码中无法访问"rr"元素的问题
看起来你的代码有两个核心问题:一是访问第四个元素("rr")时的语法错误,二是没有正确处理结果格式以匹配你期望的输出。我来帮你修正并解释清楚:
原代码的问题点
- 语法错误:
e._2.map(._3)这里缺少下划线,正确写法应该是_.apply(3)或者_(3),但即使修正这个,你会得到每个分组的"rr"列表(比如banana对应的List("rr", "rr")),这并不是你想要的单个"rr"值。 - 结果格式不匹配:你需要将分组统计后的结果拼接成空格分隔的字符串,而不是保留元组或列表形式。
修正后的代码
val listInput = List("banana 10 10 rr", "apple 20 10 rr", "apple 30 10 rr", "banana 10 10 rr", "berry 10 10 rr") val result = listInput .map(_.split("\\s+")) // 将每行按空白字符分割成字符串数组 .groupBy(_(0)) // 按水果名称(数组第一个元素)分组 .map { case (fruit, entries) => // 计算数组第二个元素的总和 val totalNum1 = entries.map(_(1).toInt).sum // 计算数组第三个元素的总和 val totalNum2 = entries.map(_(2).toInt).sum // 获取分组内第一个条目的第四个元素(所有条目都是"rr",取第一个即可) val tag = entries.head(3) // 拼接成目标格式的字符串 s"$fruit $totalNum1 $totalNum2 $tag" } .toList // 转换为List类型,匹配期望输出
关键细节说明
- 数组元素访问:用
_(index)替代apply(index)更简洁,比如_(0)就是数组的第一个元素。 - 处理"rr"元素:因为每个分组内的所有条目的第四个元素都是"rr",直接取分组中第一个条目的
(3)索引值即可,不需要遍历所有条目,既简洁又高效。 - 字符串拼接:使用Scala的字符串插值
s"..."可以轻松将变量拼接成目标格式的字符串。 - 转换为List:最后调用
toList将Map的值转换为List,完全匹配你期望的输出格式。
运行这段代码后,result的值就是你想要的:
List("banana 20 20 rr", "apple 50 20 rr", "berry 10 10 rr")
内容的提问来源于stack exchange,提问作者user9683185
相关产品推荐
相关产品推荐

