In many cases, we need to delete the last char of a StringBuilder/StringBuffer. For example, given a int[]{1,2,3}
, to implement a String toString(int[] a)
method, contacting each elements with a comma separator. The output should be 1,2,3
, no tailing comma.
We can easily write a loop:
int[] nums = new int[]{1,2,3,4,5};
StringBuilder sb = new StringBuilder();
for (int i = 0; i < nums.length; i++) {
sb.append(nums[i]);
sb.append(",");
}
//here we need to remove the tailing ','
but always we need to remove the tailing ','
. There are two ways to implement it:
sb.deleteCharAt(sb.length() - 1);
and
sb.setLength(sb.length() - 1);
Which one is recommended? Why?
NOTE:
I know what does Arrays.toString
do. That's just an example to describe my question, maybe not quite proper.
This is not a discussion about strings concatenation but the best practices of StringBuffer/StringBuilder.
The idea is to use the deleteCharAt() method of StringBuilder class to remove first and the last character of a string. The deleteCharAt() method accepts a parameter as an index of the character you want to remove. Remove last character of a string using sb. deleteCharAt(str.
In order to remove a substring from a Java StringBuilder Object, we use the delete() method. The delete() method removes characters in a range from the sequence. The delete() method has two parameters, start, and end. Characters are removed from start to end-1 index.
Using StringBuilder's deleteCharAt() Method It allows us to remove the character at the desired position. The deleteCharAt() method has only one argument: the char index we want to delete. Therefore, if we pass the last character's index to the method, we can remove the character.
Actually, there is very little in it and is probably dependent on hardware and other factors.
The setLength()
method simply alters the count and overwrites the unwanted value in the array with a zero byte.
The deleteCharAt()
performs an array copy internally, before altering the count. That sounds dramatic, but the array being copied is actually zero-length because you're removing the last character.
I would recommend going for setLength()
as it is shorter to type and I think makes it clearer what you are doing. If performance is an issue and, on measuring, you find this is the bottleneck for you, then perhaps you could consider a different algorithm that doesn't require changing the size (as per JB Nizet's answer).
How you do it properly is to conditionally prepend the comma:
for (int i = 0; i < nums.length; i++) {
if (i > 0)
sb.append(',');
sb.append(nums[i]);
}
Then you don't need to worry about removing the last character, because it's already correct.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With