Scala列表分组需求:按字符组成相同性对指定列表分组
解决Scala列表按字符异位词分组的问题
嘿,这个分组需求其实核心是识别字符异位词——也就是那些字符组成完全相同、只是顺序不同的字符串,把它们归为一组对吧?用Scala的集合API可以轻松实现,下面是具体的解决方法:
核心思路
为每个字符串生成一个唯一的分组标识:把字符串的字符排序后转成新字符串,比如"BCA"排序后是"ABC","CAB"排序后也是"ABC",这样所有异位词的标识就完全一致,用这个标识作为分组key就行。
完整代码实现
// 你的原始列表 val list1 = List("ABC","BCA","YRT","CAB","RTZ","XYZ","YXZ") // 第一步:按排序后的字符串分组 val grouped = list1.groupBy(str => str.sorted) // 第二步:提取分组后的各组数据,转成你需要的格式 val result = grouped.values.map(_.toTuple).toList // 打印结果看看 println(result) // 输出:List((ABC,BCA,CAB), (YRT), (RTZ), (XYZ,YXZ))
代码细节解释
groupBy(str => str.sorted):这是关键一步!str.sorted会把字符串的字符按自然顺序排序,比如"YXZ"排序后变成"XYZ",这样所有异位词都会被映射到同一个key下,自动完成分组。grouped.values:groupBy返回的是一个Map(key是排序后的字符串,value是对应分组的列表),我们只需要取所有的value(也就是各个分组)。map(_.toTuple):如果你需要把每个分组的List转成元组(和你给出的结果格式一致),Scala 2.13及以上版本支持toTuple方法,它会自动把不同长度的List转换成对应长度的元组(比如单元素List转成单元素元组,三元素List转成三元组)。.toList:最后把结果转成List类型,方便后续使用。
这样处理后,得到的结果完全符合你的要求啦!
内容的提问来源于stack exchange,提问作者user9846972
相关产品推荐
相关产品推荐

