Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

deleteCharAt or setLength, which way is better to remove last char from a StringBuilder/StringBuffer

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.

like image 868
Weibo Li Avatar asked Feb 08 '14 11:02

Weibo Li


People also ask

How do I remove the last character of a 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.

How do I remove a character from StringBuilder?

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.

How do I remove the last two characters in string builder?

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.


2 Answers

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).

like image 105
ᴇʟᴇvᴀтᴇ Avatar answered Sep 19 '22 14:09

ᴇʟᴇvᴀтᴇ


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.

like image 24
Bohemian Avatar answered Sep 16 '22 14:09

Bohemian