如下所示:
val a: List[String] = List(aaaaa1, aaaaa2, bb, cc, dd1, ee, dd2, dd3, ff, ggg1, ggg2, aaaaa3)
如何删除列表中具有相同前缀字符串(2到5个字符)的元素?
例如:
" aaaaa1"" aaaaa2"" aaaaa3"具有相同的前缀字符串" aaaaa"(5个字符)。所以删除它们。
" DD1"" DD2"" DD3"具有相同的前缀String" dd"(2个Chars)。所以删除它们。
" ggg1"" ggg2"具有相同的前缀字符串" ggg"(3个字符)。所以删除它们。
预期:
val b: List[String] = List(bb,cc,ee,ff)
==========
感谢你的想法。现在解决它。a.foldLeft(scala.collection.mutable.LinkedHashMap[String,Int]().withDefaultValue(0)){
case(m,e) =>
val k = e.take(2)
m(k)+=1
m
}.filter(_._2==1).keys.toList
答案 0 :(得分:2)
试试这个。
a.groupBy(_.take(2)).values.collect{case x if x.length == 1 => x.head}
// res0: Iterable[String] = List(cc, bb, ee, ff)
原始订单不会保留,因为该集合会通过Map()
阶段,根据定义,该阶段没有内在订单。
<强>更新强>
原始订单可以保留,但需要两个步骤。
val uniqPrefix = a.groupBy(_.take(2)).mapValues(_.length == 1)
a.filter(x => uniqPrefix(x.take(2)))
// res0: List[String] = List(bb, cc, ee, ff)
答案 1 :(得分:1)
我认为在这种情况下可以使用此代码:
val list = List(
"aaaaa1", "aaaaa2", "bb", "cc", "dd1", "ee", "dd2", "dd3", "ff", "ggg1", "ggg2", "aaaaa3")
val prefix2items = list.groupBy(_.take(2))
list.filter(item => prefix2items(item.take(2)).length == 1)
//res0: List[String] = List(bb, cc, ee, ff)
答案 2 :(得分:0)
即使您在前缀
中有多个字符,这也会有效前缀将被识别,直到获得一个数字,数字后面的字符将不被视为此处的前缀
val a = List(“abb1”,“abbbbbb1”,“aaaaa2”,“aaaaa3”,“aaaaaa44”)
“abb1”将在这里删除
a.filter(_.takeWhile(data => !data.isDigit).groupBy(_.toChar).values.exists{case x if (2 to 5).contains(x.length) => true case _ => false})