从scala中的字符列表中删除字符

时间:2018-02-25 14:25:34

标签: string scala char indexof

我在Scala中有这个字符列表:

val a = "(i am(a? list) of(/ chars in  )Scala)".toList

我想找到第一个')'的位置并从列表中删除它。我怎么能这样做?

我做了什么(但没有奏效):

val position = a.tail.indexOf(')')
a.drop(position)

并尝试使用a.take(position)。我发现方法droptake并不适合我需要的方法。我希望该方法的工作原理如下:

input:  (i am(a? list) of(/ chars in )Scala)
output: (i am(a? list of(/ chars in )Scala)
                     ^

4 个答案:

答案 0 :(得分:6)

经常被忽视的patch()会做到这一点。

a.patch(a.indexOf(')'), List(), 1)

请注意,如果目标元素不存在,indexOf()会产生误导性结果。

val result = if (a.contains(')') a.patch(a.indexOf(')'), List(), 1)
             else a

答案 1 :(得分:1)

takedrop辩护:这两种方法完全符合您的要求:

val str = "(i am(a? list) of(/ chars in )Scala)"
val idx = str.indexOf(')')
println(str.take(idx) + str.drop(idx + 1))

还有span,同时执行takedrop

val (before, after) = str.splitAt(idx)
println(before + after.tail)

两个版本输出

(i am(a? list of(/ chars in )Scala)
(i am(a? list of(/ chars in )Scala)

答案 2 :(得分:0)

您可以使用foldLeft

删除元素

首先执行zipWithIndex以获得列表中每个字符的索引,然后使用foldLeft,如果索引匹配所需的索引,则不要将该元素添加到累加器:

a.zipWithIndex
 .foldLeft(Nil: List[Char])((acc, elem) => if (elem._2 == a.indexOf(')')) acc  else acc:+elem._1)

a.zipWithIndex

的结果
List[(Char, Int)] = List(((,0), (i,1), ( ,2), (a,3), (m,4), ((,5), (a,6), (?,7), ( ,8), (l,9), (i,10), (s,11), (t,12), (),13), ( ,14), (o,15), (f,16), ((,17), (/,18), ( ,19), (c,20), (h,21), (a,22), (r,23), (s,24), ( ,25), (i,26), (n,27), ( ,28), ( ,29), (),30), (S,31), (c,32), (a,33), (l,34), (a,35), (),36))

最终结果:

List[Char] = List((, i,  , a, m, (, a, ?,  , l, i, s, t,  , o, f, (, /,  , c, h, a, r, s,  , i, n,  ,  , ), S, c, a, l, a, ))

最终结果为字符串:

String = (i am(a? list of(/ chars in  )Scala)

答案 3 :(得分:0)

尝试一下:

a.replaceFirst("\\)","")

在Scala REPL中:

scala> val a = "(i am(a? list) of(/ chars in  )Scala)"
a: String = (i am(a? list) of(/ chars in  )Scala)


scala> a.replaceFirst("\\)","")
res123: String = (i am(a? list of(/ chars in  )Scala)

scala>