stringbuilder Scala删除重复字符 类缓冲区(s:String){ 导入scala.collection.mutable.StringBuilder 导入scala.io.StdIn 私有变量缓冲区:StringBuilder=新StringBuilder 私有变量游标:Int=0//游标位于字符之间 私有变量标记:Int=0//标记位于字符之间 私有变量粘贴:String=“” private def end:Int=buffer.length//行的末尾 私有def lwr:Int=Math.min(标记、光标) 私有def upr:Int=Math.max(标记、光标) /* *用于返回状态方面的访问器方法 */ def getCursor:Int=cursor def getMarker:Int=marker def getString:String=buffer.toString def getPaste:String=粘贴 /** *删除重复字符。在定义的区域内,对于每个字符, *如果发生一次,则保留;如果发生多次,则保留 *仅第一次出现。字符位于 *已定义的区域保持不变,但在已定义的区域内,会出现重复项 *已删除。此操作不影响粘贴缓冲区。光标为 *最后放置在定义区域的下端,并放置标记 *最后在(可能减少的)定义区域的上端。例如: * *m i s s s i s i p p i标记=1 *^^光标=10 * *然后执行sc('a','X')) * *m i s p i标记=1 *^^光标=4 */ def dd() { var-droppedchars:Int=0; 因为(x

stringbuilder Scala删除重复字符 类缓冲区(s:String){ 导入scala.collection.mutable.StringBuilder 导入scala.io.StdIn 私有变量缓冲区:StringBuilder=新StringBuilder 私有变量游标:Int=0//游标位于字符之间 私有变量标记:Int=0//标记位于字符之间 私有变量粘贴:String=“” private def end:Int=buffer.length//行的末尾 私有def lwr:Int=Math.min(标记、光标) 私有def upr:Int=Math.max(标记、光标) /* *用于返回状态方面的访问器方法 */ def getCursor:Int=cursor def getMarker:Int=marker def getString:String=buffer.toString def getPaste:String=粘贴 /** *删除重复字符。在定义的区域内,对于每个字符, *如果发生一次,则保留;如果发生多次,则保留 *仅第一次出现。字符位于 *已定义的区域保持不变,但在已定义的区域内,会出现重复项 *已删除。此操作不影响粘贴缓冲区。光标为 *最后放置在定义区域的下端,并放置标记 *最后在(可能减少的)定义区域的上端。例如: * *m i s s s i s i p p i标记=1 *^^光标=10 * *然后执行sc('a','X')) * *m i s p i标记=1 *^^光标=4 */ def dd() { var-droppedchars:Int=0; 因为(x,scala,stringbuilder,Scala,Stringbuilder,你要做的事情需要O(n^2),从性能的角度来看这不是很好。。。 在我看来,更好的一种解决方案是在缓冲区上只使用一个循环,在其中使用一个字符c,您应该使用一组字符(在for循环之外声明)进行检查: (x为什么不: for (x <- lwr until upr) { var c = buffer.charAt(x) if (chars contains c) buffer.deleteCharAt(x) else chars += c } cursor = marker + cha

你要做的事情需要O(n^2),从性能的角度来看这不是很好。。。 在我看来,更好的一种解决方案是在缓冲区上只使用一个循环,在其中使用一个字符c,您应该使用一组字符(在for循环之外声明)进行检查:

(x为什么不:

for (x <- lwr until upr) {
  var c = buffer.charAt(x)
  if (chars contains c) buffer.deleteCharAt(x) else chars += c
}
cursor = marker + chars.size

从另一个角度看,我发现基于改变StringBuilder的方法中存在一个问题…一旦执行deleteCharAt,x就会随着符号总数的减少而变得不正确。因此,只有在没有重复的情况下x才会增加,否则x就会保持不变。
object immutable不是包的成员scala
好吧,它是一个包——显然,它应该是一个集合,并且随着时间的推移集合会发生变化。因此,正确的一个包是scala.collection.mutable(您可以省略scala包):val chars=scala.collection.mutable.set[Char]()
org.junit.ComparisonFailure:expected:但它是一个[rdvr]k
。distinct不仅仅影响已定义的region@MikeNoelHiggs:对不起,我不明白你的评论。“土豚”.distinct在我的系统上产生ardvk。distinct影响整个字符串,而不是其特定区域。@AlexEvseenko我们可以在给定区域内使用distinct而不是整个字符串吗?当然可以,但如果目标是实现算法,它不是解决方案,这是TC的问题。
val  chars = scala.collection.mutable.Set[Char]()
for (x <- lwr until upr) {
  var c = buffer.charAt(x)
  if (chars contains c) buffer.deleteCharAt(x) else chars += c
}
cursor = marker + chars.size
scala> "mississippi".distinct
res22: String = misp