Scala中如何从Map列表中获取唯一Map实例
如何在Scala中去除List里的重复Map实例
问题描述
你需要将包含重复Map的List精简为仅保留唯一Map实例,输入示例如下:
List( Map(LN->ABC,FN->CDE, Phones -> List(Map(CellPhone-> 1388798,sqno ->1))), Map(LN->ABC,FN->CDE, Phones -> List(Map(CellPhone-> 1388798,sqno ->1))), Map(LN->DNB,FN->CDE, Phones -> List(Map(CellPhone-> 1388780,sqno ->2))), Map(LN->DNB,FN->CDE, Phones -> List(Map(CellPhone-> 1388780,sqno ->2))) )
期望输出为包含2个唯一Map的集合:
List( Map(LN->ABC,FN->CDE, Phones -> List(Map(CellPhone-> 1388798,sqno ->1))), Map(LN->DNB,FN->CDE, Phones -> List(Map(CellPhone-> 1388780,sqno ->2))) )
你的代码问题分析
你当前的代码存在两个核心问题:
- 类型转换错误:
tmp.map(_.asInstanceOf[List[Map[String, Any]]])试图将单个Map转为List[Map],这会抛出类型转换异常,因为tmp的元素本身就是Map,并非List。 - 逻辑方向错误:使用
foldLeft会将List中的元素逐个合并为单个Map,最终只会保留最后一个迭代的Map内容,这和你“保留所有唯一Map”的需求完全不符。
正确实现方法
Scala的List类内置了**distinct**方法,可直接用于去除集合中的重复元素。由于Scala的Map会递归比较内部所有元素的相等性(只要元素本身支持相等判断),完全相同的Map会被判定为相等,因此直接调用distinct就能实现需求。
示例代码
// 定义输入List val inputList = List( Map("LN" -> "ABC", "FN" -> "CDE", "Phones" -> List(Map("CellPhone" -> "1388798", "sqno" -> 1))), Map("LN" -> "ABC", "FN" -> "CDE", "Phones" -> List(Map("CellPhone" -> "1388798", "sqno" -> 1))), Map("LN" -> "DNB", "FN" -> "CDE", "Phones" -> List(Map("CellPhone" -> "1388780", "sqno" -> 2))), Map("LN" -> "DNB", "FN" -> "CDE", "Phones" -> List(Map("CellPhone" -> "1388780", "sqno" -> 2))) ) // 去除重复Map val uniqueMaps = inputList.distinct // 输出结果 uniqueMaps.foreach(println)
输出结果
Map(LN -> ABC, FN -> CDE, Phones -> List(Map(CellPhone -> 1388798, sqno -> 1))) Map(LN -> DNB, FN -> CDE, Phones -> List(Map(CellPhone -> 1388780, sqno -> 2)))
内容的提问来源于stack exchange,提问作者ssk
相关产品推荐
相关产品推荐

