如何删除列表中具有相同前缀字符串(2到5个字符)的元素?

时间:2017-09-03 06:17:25

标签: scala

如下所示:

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

3 个答案:

答案 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})