使用Generics(泛型)实现任意类型列表元素分组的问题求解
问题原因
- 泛型参数无约束导致
null不合法。Scala中null仅可用于继承自AnyRef的引用类型,未添加上界的泛型A可匹配任意类型(包括Int、Boolean这类值类型),值类型不接受null作为有效值,直接触发编译错误。 - 变量名拼写错误。泛型版本的辅助函数
groupHelper将当前分组参数命名为currentList,但空列表判断分支中错误沿用了字符串版本的参数名outputListCurrent,导致编译时提示变量未定义。 - 边界场景处理缺陷。原实现传入空列表时,会执行
List(null).tail调用,空列表调用tail方法会直接抛出运行时异常。
正确实现
要实现全类型支持,可彻底移除null的使用,避免类型限制和空指针风险,同时修正变量名和边界逻辑,实现代码如下:
def group[A](list: List[A]): List[List[A]] = { // 辅助函数参数:剩余待处理元素、当前分组、已完成分组结果 def groupHelper(remaining: List[A], currentGroup: List[A], result: List[List[A]]): List[List[A]] = { remaining match { // 无剩余元素,将当前分组加入结果返回 case Nil => result :+ currentGroup // 当前元素和当前分组首个元素相同,加入当前分组 case head :: tail if head == currentGroup.head => groupHelper(tail, currentGroup :+ head, result) // 当前元素不同,将当前分组加入结果,新建分组 case head :: tail => groupHelper(tail, List(head), result :+ currentGroup) } } // 处理空列表边界 list match { case Nil => Nil case head :: tail => groupHelper(tail, List(head), Nil) } }
该实现支持任意类型的列表分组,彻底规避了null相关的类型问题和运行时风险,同时兼容空列表等边界场景,测试效果如下:
// 测试值类型 println(group(List(1,1,2,2,3,3,3))) // 输出:List(List(1, 1), List(2, 2), List(3, 3, 3)) // 测试引用类型 println(group(List("a","a","b","c","c"))) // 输出:List(List(a, a), List(b), List(c, c))
内容的提问来源于stack exchange,提问作者learningJava2020
相关产品推荐
相关产品推荐

