我在Scala中有这个字符列表:
val a = "(i am(a? list) of(/ chars in )Scala)".toList
我想找到第一个')'的位置并从列表中删除它。我怎么能这样做?
我做了什么(但没有奏效):
val position = a.tail.indexOf(')')
a.drop(position)
并尝试使用a.take(position)
。我发现方法drop
和take
并不适合我需要的方法。我希望该方法的工作原理如下:
input: (i am(a? list) of(/ chars in )Scala)
output: (i am(a? list of(/ chars in )Scala)
^
答案 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)
为take
和drop
辩护:这两种方法完全符合您的要求:
val str = "(i am(a? list) of(/ chars in )Scala)"
val idx = str.indexOf(')')
println(str.take(idx) + str.drop(idx + 1))
还有span
,同时执行take
和drop
:
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> 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>