Stringbuilder - 用一个字符替换一个字符的所有实例**

时间:2018-04-20 10:58:59

标签: scala junit stringbuilder

第一次在这里发帖,请告诉我是否需要更改格式,我会这样做。

我需要从缓冲区中提取一个已定义的区域,并应用将字符“y”替换为字符“y”的代码,我在下面尝试过:

buffer.substring(lwr,upr).replace(s,t)

然而,我的所有JUNIT测试都失败了,我无法理解为什么。

有人有任何指针吗?谢谢!

编辑:

例如,给出以下内容:

a p p r o p r i a t e      (Marker position is 2, cursor position is 6)
   ^       ^

执行“subChar('p','x')应该导致输出:

a p x r o x r i a t e      (Marker position and cursor position DO NOT CHANGE)
   ^       ^

2 个答案:

答案 0 :(得分:0)

我认为你的问题是你的Buffer,我创建了一个ScalaFiddle,它演示了简单的String和一个简单的List实现:

val str = "appropriate"

println (str.replace('p', 'x')) // axxroxriate

val list = str.toList.map{
  case c if c == 'p' => 'x'
  case c => c
} 

println (list) // List(a, x, x, r, o, x, r, i, a, t, e)

检查您的实施或将您的实施添加到您的问题中。

以下是区域的示例:

def replaceBetween(str: String, start: Int, end: Int, what: Char, byWhat: Char): String = {
  val prefix = str.take(start)
  val postfix = str.drop(end)
  val toMap = str.drop(start).take(end-start).replace(what, byWhat)

  prefix + toMap + postfix
}

println(replaceBetween("appropriate", 2, 6, 'p', 'x')) 

您可以尝试自己:ScalaFiddle

答案 1 :(得分:0)

如果你接受一个字符串,然后子字符串,然后在结果上调用replace,结果字符串将与原始字符串无关,因此你的解决方案显然无法工作。

链接答案的索引方案保持不变,答案很容易推广到可应用于字符的任意函数:

def mapBetween(str: String, start: Int, end: Int)(f: Char => Char) = { 
  val (a, bc) = str.splitAt(start)
  val (b, c) = bc.splitAt(end - start)
  a + b.map(f) + c 
}

def replaceBetween(str: String, start: Int, end: Int, what: Char, byWhat: Char): String = {
  mapBetween(str, start, end){ c =>
    if (c == what) byWhat else c
  }
}

根据上述定义,这里:

println(replaceBetween("appropriate", 2, 6, 'p', 'x')) 

产生

apxroxriate