Scala中ListBuffer存储Array[String]异常及二维集合需求问题
问题分析与解决方案
为什么内容会丢失?
你遇到的问题有两个核心原因:
类型不匹配导致的强制转换
当你定义var fruits = new ListBuffer[String]()时,这个集合只能存储String类型的数据。但current_line_values_1是Array[String]类型,所以你不得不调用toString把数组转成字符串才能存入——而这个toString返回的是Java数组的默认对象标识(比如[Ljava.lang.String;@51dd09f),不是数组里的实际内容。Scala数组的默认
toString行为
Scala的Array本质上是Java数组的包装,它的默认toString方法不会遍历输出元素,只会返回数组的类名和内存哈希码,所以即使你存的是数组的字符串表示,也看不到实际内容。
如何正确实现存储Array[String]的二维集合?
方法1:使用正确类型的ListBuffer
如果你需要动态添加元素,先确保ListBuffer的泛型是Array[String],然后直接添加数组对象即可,不需要调用toString:
import scala.collection.mutable.ListBuffer // 定义存储Array[String]的ListBuffer val fruits = ListBuffer[Array[String]]() // 直接添加数组对象,无需toString fruits += current_line_values_1 fruits += current_line_values_2 // 遍历输出时,用mkString把数组转成可读字符串 fruits.foreach { arr => println(arr.mkString("[", ", ", "]")) }
方法2:直接生成不可变二维集合(更符合Scala风格)
如果不需要动态添加元素,直接把整个lines转换成二维数组/集合会更简洁:
// 直接将所有行处理成Array[Array[String]] val twoDimArray: Array[Array[String]] = lines.map { line => line.split("\\|", -1).map { x => val trimmed = x.trim if (trimmed.isEmpty) "empty string" else trimmed } }.toArray // 遍历输出示例 twoDimArray.foreach { arr => println(arr.mkString("[", ", ", "]")) }
这样得到的twoDimArray就是你想要的二维集合,每个元素都是处理后的Array[String],可以直接访问其中的内容。
内容的提问来源于stack exchange,提问作者Ged
相关产品推荐
相关产品推荐

