2015-04-07 39 views
1

我在找出如何使用scala可以刪除指定位置的元素時遇到問題。如何在字符串中添加特定元素

如何使用scala在字符串的指定位置放置字符以及如何在scala的字符串的指定位置添加字符?

+3

告訴我們你試過或研究過什麼? – Muds

回答

1

@BenReich使用patch可能是最習慣和最整潔的方法;另一種方式包括例如使用takedrop在字符串的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 

注意,這不是大串的最有效的方法。

1

您可以使用「子字符串」將字符串分解爲兩部分,然後在添加所需字符之後,可以再次合併它們。

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,這是相當高的了類型層次,這樣你就可以在其他類型使用patchString

List(1, 2, 3, 4, 5, 6, 7).patch(4, Seq(), 1) //List(1, 2, 3, 4, 6, 7) 

閱讀文檔patchhere

您也可以豐富GenSeqLike使這種類型的方法更容易availble的:

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 

當然,如果你是在加入給你的標準您可能會考慮進行一些邊界檢查。

相關問題