Mam problem ze znalezieniem sposobu, w jaki element w określonej pozycji może zostać upuszczony za pomocą scali.
Jak upuścić znak na określonej pozycji w ciągu za pomocą scala, a także jak dodać znak na określonej pozycji w ciągu w scali?
Odpowiedzi:
1 dla odpowiedzi № 1Za pomocą patch
autorstwa @BenReich jest prawdopodobnie najbardziej idiomatycznym i zgrabnym podejściem do tego; inny sposób obejmuje na przykład użycie take
i drop
nad łańcuchem jako sekwencja Char
, lubię to,
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
Zauważ, że nie jest to najbardziej wydajne podejście w przypadku dużych łańcuchów.
3 dla odpowiedzi № 2
Większość tego można zrobić za pomocą patch
metoda:
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"
Metoda jest zdefiniowana w dniu GenSeqLike
, który jest dość wysoko w hierarchii typów, więc możesz użyć patch
na typach innych niż String
:
List(1, 2, 3, 4, 5, 6, 7).patch(4, Seq(), 1) //List(1, 2, 3, 4, 6, 7)
Przeczytaj dokumentację patch
tutaj.
Możesz też wzbogacić GenSeqLike
aby ułatwić dostęp do tego typu metody:
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)
}
A następnie możesz zrobić:
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
Oczywiście, jeśli dodajesz to do swojej standardowej biblioteki, możesz rozważyć sprawdzenie niektórych granic.
1 dla odpowiedzi nr 3
Możesz użyć „podłańcucha”, aby rozbić napis na dwie części, a następnie po dodaniu wymaganego znaku możesz je ponownie połączyć.