package java.lang class StringBuilder(private var content: String) extends CharSequence with Appendable with java.io.Serializable { def this() = this("") def this(initialCapacity: Int) = this("") def this(csq: CharSequence) = this(csq.toString) def append(s: String): StringBuilder = { content += { if (s == null) "null" else s } this } def append(b: scala.Boolean): StringBuilder = append(b.toString()) def append(c: scala.Char): StringBuilder = append(c.toString()) def append(str: Array[scala.Char]): StringBuilder = append(str, 0, str.length) def append(str: Array[scala.Char], offset: Int, len: Int): StringBuilder = { var i = 0 while (i < len) { content += str(i + offset) i += 1 } this } def append(b: scala.Byte): StringBuilder = append(b.toString()) def append(s: scala.Short): StringBuilder = append(s.toString()) def append(i: scala.Int): StringBuilder = append(i.toString()) def append(lng: scala.Long): StringBuilder = append(lng.toString()) def append(f: scala.Float): StringBuilder = append(f.toString()) def append(d: scala.Double): StringBuilder = append(d.toString()) def append(obj: AnyRef): StringBuilder = { if (obj == null) append(null: String) else append(obj.toString()) } def append(csq: CharSequence): StringBuilder = append(csq: AnyRef) def append(csq: CharSequence, start: Int, end: Int): StringBuilder = { if (csq == null) append("null", start, end) else append(csq.subSequence(start, end).toString()) } override def toString() = content def length() = content.length() def charAt(index: Int) = content.charAt(index) def codePointAt(index: Int) = content.codePointAt(index) def indexOf(str: String) = content.indexOf(str) def indexOf(str: String, fromIndex: Int) = content.indexOf(str, fromIndex) def lastIndexOf(str: String) = content.lastIndexOf(str) def lastIndexOf(str: String, fromIndex: Int) = content.lastIndexOf(str, fromIndex) def subSequence(start: Int, end: Int): CharSequence = substring(start, end) def substring(start: Int): String = content.substring(start) def substring(start: Int, end: Int): String = content.substring(start, end) def reverse(): StringBuilder = { val original = content var result = "" var i = 0 while (i < original.length) { val c = original.charAt(i) if (Character.isHighSurrogate(c) && (i+1 < original.length)) { val c2 = original.charAt(i+1) if (Character.isLowSurrogate(c2)) { result = c.toString + c2.toString + result i += 2 } else { result = c.toString + result i += 1 } } else { result = c.toString + result i += 1 } } content = result this } def deleteCharAt(index: Int): StringBuilder = { if (index < 0 || index >= content.length) throw new StringIndexOutOfBoundsException("String index out of range: " + index) content = content.substring(0, index) + content.substring(index+1) this } /** * @param start The beginning index, inclusive. * @param end The ending index, exclusive. * @param str String that will replace previous contents. * @return This StringBuilder. */ def replace(start: Int, end: Int, str: String): StringBuilder = { val length = content.length if (start < 0 || start > end || start >= length) throw new StringIndexOutOfBoundsException(s"Illegal to replace substring at [$start - $end] in string of length $length") val realEnd = if (end > length) length else end // java api convention content = content.substring(0, start) + str + content.substring(realEnd) this } def setCharAt(index: Int, ch: scala.Char): Unit = { if (index < 0 || index >= content.length) throw new IndexOutOfBoundsException("String index out of range: " + index) content = content.substring(0, index) + ch + content.substring(index + 1) } def setLength(newLength: Int): Unit = { if (newLength < 0) throw new IndexOutOfBoundsException("String index out of range: " + newLength) val len = length() if (len == newLength) { } else if (len < newLength) { var index = len while (index < newLength) { append("\u0000") index += 1 } } else { content = substring(0, newLength) } } def insert(index: Int, b: scala.Boolean): StringBuilder = insert(index, b.toString) def insert(index: Int, b: scala.Byte): StringBuilder = insert(index, b.toString) def insert(index: Int, s: scala.Short): StringBuilder = insert(index, s.toString) def insert(index: Int, i: scala.Int): StringBuilder = insert(index, i.toString) def insert(index: Int, l: scala.Long): StringBuilder = insert(index, l.toString) def insert(index: Int, f: scala.Float): StringBuilder = insert(index, f.toString) def insert(index: Int, d: scala.Double): StringBuilder = insert(index, d.toString) def insert(index: Int, c: scala.Char): StringBuilder = insert(index, c.toString) def insert(index: Int, csq: CharSequence): StringBuilder = insert(index: Int, csq: AnyRef) def insert(index: Int, arr: Array[scala.Char]): StringBuilder = insert(index, arr, 0, arr.length) def insert(index: Int, ref: AnyRef): StringBuilder = if (ref == null) insert(index, null: String) else insert(index, ref.toString) def insert(index: Int, csq: CharSequence, start: Int, end: Int): StringBuilder = if (csq == null) insert(index, "null", start, end) else insert(index, csq.subSequence(start, end).toString) def insert(index: Int, arr: Array[scala.Char], offset: Int, len: Int): StringBuilder = { var str = "" var i = 0 while (i < len) { str += arr(i + offset) i += 1 } insert(index, str) } def insert(index: Int, str: String): StringBuilder = { val thisLength = length() if (index < 0 || index > thisLength) throw new StringIndexOutOfBoundsException(index) else if (index == thisLength) append(str) else content = content.substring(0, index) + Option(str).getOrElse("null") + content.substring(index) this } }