我在查找如何使用scala删除指定位置的元素时遇到问题。
如何使用scala将字符拖放到字符串中的指定位置,以及如何在scala中的字符串中的指定位置添加字符?
答案 0 :(得分:3)
大多数情况可以使用patch
方法完成:
val x = "abcdefgh"
//Replace 1 element starting at the 4th position with "" (thereby eliminating the fourth element)
x.patch(4, "", 1) //"abcdfgh"
//Replace 0 elements starting at the 4th position with "A" (thereby adding an element after the fourth element)
x.patch(4, "A", 0) //"abcdAefgh"
该方法在GenSeqLike
上定义,它在类型层次结构中非常高,因此您可以在patch
以外的类型上使用String
:
List(1, 2, 3, 4, 5, 6, 7).patch(4, Seq(), 1) //List(1, 2, 3, 4, 6, 7)
阅读patch
here。
您还可以丰富GenSeqLike
以更轻松地使用此类方法:
import scala.collection.GenSeqLike
implicit class RichGenSeqLike[T, Repr <% GenSeqLike[T, Repr]](val seq: Repr) {
import scala.collection.generic.CanBuildFrom
def dropAt[That](n: Int)(implicit bf: CanBuildFrom[Repr, T, That]): That = seq.patch(n, Seq.empty[T], 1)
def addAt[That](n: Int)(ts: T*)(implicit bf: CanBuildFrom[Repr, T, That]): That = seq.patch(n, ts, 0)
}
然后你可以这样做:
List(1, 2, 3).dropAt(1) //List(1, 3)
"abc".dropAt(1) //"ac"
List(1, 2, 3).addAt(1)(4) //List(1, 4, 2, 3)
List(1, 2, 3).addAt(1)(4, 5, 6) //List(1, 4, 5, 6, 2, 3)
"abc".addAt(1)('A') //aAbc
"abc".addAt(1)('A', 'B') //aABbc
"abc".addAt(1)("ABC":_*) //aABCbc
当然,如果您将其添加到标准库中,您可能会考虑进行一些边界检查。
答案 1 :(得分:1)
您可以使用“子字符串”将字符串分解为两部分,然后在添加所需字符后,可以再次组合它们。
答案 2 :(得分:1)
使用@BenReich的patch
可能是最惯用和最简洁的方法;另一种方式包括例如在字符串上使用take
和drop
作为Char
的序列,就像这样,
val s = ('a' to 'e').mkString
s: String = abcde
scala> s.take(2) ++ s.drop(3) // remove third char
res0: String = abde
scala> s.take(2) ++ "CCC" ++ s.drop(3) // replace third char with a string
res1: String = abCCCde
scala> s.take(2) ++ s.drop(4) // remove from third to fourth chars
res2: String = abe
请注意,这不是大字符串最有效的方法。