/ / Jak dodać konkretny element do łańcucha - scala

Jak dodać konkretny element w łańcuchu - scala

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 № 1

Za 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ć.