Scala 中字符串的 Swap/update/change 个字符:使用 mutable/unmutable 个字符串处理
Swap/update/change characters of string in scala: Handling with mutable/unmutable strings
我是 scala 语言的新手,我需要的是我想循环旋转一个字符串,例如一个字符串 = "love",当我们执行循环旋转时,这个结果应该像这个字符串 "elov"。这是我写的代码
第一个方法代码 1
import scala.util.control._
import com.sun.xml.internal.bind.v2.schemagen.xmlschema.List
object StringAlgorithm {
def swap(s : String, idx1 : Int, idx2 : Int){
val cs = s.toCharArray
val swp = cs(idx1)
cs(idx1) = cs(idx2)
cs(idx2) = swp
println(cs)
}
def main(args: Array[String}){
var str2 ="ovel"
var str2len = str2.length()
val LastIndex = str2len -1
println(LastIndex)
//val cs = Array[Char](4)
//println(cs)
var i : Int = 0
for(i <- 0 to LastIndex){
swap(str2, i, LastIndex)
}
println(str2)
}
}
上面一个不工作
第二个方法代码 2
object test {
def main(args: Array[String]) {
var str = "Hello"
println(str)
var str1 = str.toList
println(str1)
val str1en = (str1.length) - 1
println(str1en)
for ( i <- 0 to str1en){
var temp = str1(i)
var temp1 = str1(str1en)
str1.updated(i, temp1)
str1.updated(str1en, temp)
}
println(str1)
}
}
这是一个相当简单的 Scala-ish 解决方案
val str = "Hello"
for {i <- 1 until str.length
(a,b) = str.splitAt(i)}
yield b + a
// Vector(elloH, lloHe, loHel, oHell)
一个使用迭代器的版本(Scala 风格略少?)
Iterator.iterate(str){s=>s.last + s.init}.take(str.length).toList
更直接地使用 List 伴随对象中的方法
List.iterate(str, str.length){s=>s.last + s.init}
这是我的想法:
def cycleOnce(word: String): String = word.last + word.init
def cycled(word: String) = (1 until word.size)
.foldLeft(List(word))((list, _) => cycleOnce(list.head) :: list).reverse
使用:
scala> cycled("love")
res4: List[String] = List(love, elov, velo, ovel)
我是 scala 语言的新手,我需要的是我想循环旋转一个字符串,例如一个字符串 = "love",当我们执行循环旋转时,这个结果应该像这个字符串 "elov"。这是我写的代码
第一个方法代码 1
import scala.util.control._
import com.sun.xml.internal.bind.v2.schemagen.xmlschema.List
object StringAlgorithm {
def swap(s : String, idx1 : Int, idx2 : Int){
val cs = s.toCharArray
val swp = cs(idx1)
cs(idx1) = cs(idx2)
cs(idx2) = swp
println(cs)
}
def main(args: Array[String}){
var str2 ="ovel"
var str2len = str2.length()
val LastIndex = str2len -1
println(LastIndex)
//val cs = Array[Char](4)
//println(cs)
var i : Int = 0
for(i <- 0 to LastIndex){
swap(str2, i, LastIndex)
}
println(str2)
}
}
上面一个不工作
第二个方法代码 2
object test {
def main(args: Array[String]) {
var str = "Hello"
println(str)
var str1 = str.toList
println(str1)
val str1en = (str1.length) - 1
println(str1en)
for ( i <- 0 to str1en){
var temp = str1(i)
var temp1 = str1(str1en)
str1.updated(i, temp1)
str1.updated(str1en, temp)
}
println(str1)
}
}
这是一个相当简单的 Scala-ish 解决方案
val str = "Hello"
for {i <- 1 until str.length
(a,b) = str.splitAt(i)}
yield b + a
// Vector(elloH, lloHe, loHel, oHell)
一个使用迭代器的版本(Scala 风格略少?)
Iterator.iterate(str){s=>s.last + s.init}.take(str.length).toList
更直接地使用 List 伴随对象中的方法
List.iterate(str, str.length){s=>s.last + s.init}
这是我的想法:
def cycleOnce(word: String): String = word.last + word.init
def cycled(word: String) = (1 until word.size)
.foldLeft(List(word))((list, _) => cycleOnce(list.head) :: list).reverse
使用:
scala> cycled("love")
res4: List[String] = List(love, elov, velo, ovel)