Create a string with n characters

JavaStringStringbuffer

Java Problem Overview


Is there a way in java to create a string with a specified number of a specified character? In my case, I would need to create a string with 10 spaces. My current code is:

StringBuffer outputBuffer = new StringBuffer(length);
for (int i = 0; i < length; i++){
   outputBuffer.append(" ");
}
return outputBuffer.toString();

Is there a better way to accomplish the same thing. In particular I'd like something that is fast (in terms of execution).

Java Solutions


Solution 1 - Java

Likely the shortest code using the String API, exclusively:

String space10 = new String(new char[10]).replace('\0', ' ');

System.out.println("[" + space10 + "]");
// prints "[          ]"

As a method, without directly instantiating char:

import java.nio.CharBuffer;

/**
 * Creates a string of spaces that is 'spaces' spaces long.
 *
 * @param spaces The number of spaces to add to the string.
 */
public String spaces( int spaces ) {
  return CharBuffer.allocate( spaces ).toString().replace( '\0', ' ' );
}

Invoke using:

System.out.printf( "[%s]%n", spaces( 10 ) );

Solution 2 - Java

I highly suggest not to write the loop by hand. You will do that over and over again during the course of your programming career. People reading your code - that includes you - always have to invest time, even if it are just some seconds, to digest the meaning of the loop.

Instead reuse one of the available libraries providing code that does just that like StringUtils.repeatfrom Apache Commons Lang:

StringUtils.repeat(' ', length);

That way you also do not have to bother about performance, thus all the gory details of StringBuilder, Compiler optimisations etc. are hidden. If the function would turn out as slow it would be a bug of the library.

With Java 11 it becomes even easier:

" ".repeat(length);

Solution 3 - Java

Hmm now that I think about it, maybe Arrays.fill:

char[] charArray = new char[length];
Arrays.fill(charArray, ' ');
String str = new String(charArray);

Of course, I assume that the fill method does the same thing as your code, so it will probably perform about the same, but at least this is fewer lines.

Solution 4 - Java

since Java 11:

" ".repeat(10);

since Java 8:

generate(() -> " ").limit(10).collect(joining());

where:

import static java.util.stream.Collectors.joining;
import static java.util.stream.Stream.generate;

Solution 5 - Java

The for loop will be optimized by the compiler. In such cases like yours you don't need to care about optimization on your own. Trust the compiler.

BTW, if there is a way to create a string with n space characters, than it's coded the same way like you just did.

Solution 6 - Java

In Java 8 you can use String.join:

String.join("", Collections.nCopies(n, s));

Solution 7 - Java

If you want only spaces, then how about:

String spaces = (n==0)?"":String.format("%"+n+"s", "");

which will result in abs(n) spaces;

Solution 8 - Java

Since Java 11 you can simply use String.repeat(count) to solve your problem.

> Returns a string whose value is the concatenation of this string repeated count times. > > If this string is empty or count is zero then the empty string is returned.

So instead of a loop your code would just look like this:

" ".repeat(length);

Solution 9 - Java

I think this is the less code it's possible, it uses Guava Joiner class:

> Joiner.on("").join(Collections.nCopies(10, " "));

Solution 10 - Java

You can use standard String.format function for generate N spaces. For example:

String.format("%5c", ' ');

Makes a string with 5 spaces.

or

int count = 15;
String fifteenSpacebars = String.format("%" + count + "c", ' ');

Makes a string of 15 spacebars.

If you want another symbol to repeat, you must replace spaces with your desired symbol:

int count = 7;
char mySymbol = '#';
System.out.println(String.format("%" + count + "c", ' ').replaceAll("\\ ", "\\" + mySymbol));

Output:

#######

Solution 11 - Java

My contribution based on the algorithm for fast exponentiation.

/**
 * Repeats the given {@link String} n times.
 * 
 * @param str
 *            the {@link String} to repeat.
 * @param n
 *            the repetition count.
 * @throws IllegalArgumentException
 *             when the given repetition count is smaller than zero.
 * @return the given {@link String} repeated n times.
 */
public static String repeat(String str, int n) {
	if (n < 0)
		throw new IllegalArgumentException(
				"the given repetition count is smaller than zero!");
	else if (n == 0)
		return "";
	else if (n == 1)
		return str;
	else if (n % 2 == 0) {
		String s = repeat(str, n / 2);
		return s.concat(s);
	} else
		return str.concat(repeat(str, n - 1));
}

I tested the algorithm against two other approaches:

  • Regular for loop using String.concat() to concatenate string
  • Regular for loop using a StringBuilder

Test code (concatenation using a for loop and String.concat() becomes to slow for large n, so I left it out after the 5th iteration).

/**
 * Test the string concatenation operation.
 * 
 * @param args
 */
public static void main(String[] args) {
	long startTime;
	String str = " ";

	int n = 1;
	for (int j = 0; j < 9; ++j) {
		n *= 10;
		System.out.format("Performing test with n=%d\n", n);

		startTime = System.currentTimeMillis();
		StringUtil.repeat(str, n);
		System.out
				.format("\tStringUtil.repeat() concatenation performed in    %d milliseconds\n",
						System.currentTimeMillis() - startTime);

		if (j <5) {
			startTime = System.currentTimeMillis();
			String string = "";
			for (int i = 0; i < n; ++i)
				string = string.concat(str);
			System.out
					.format("\tString.concat() concatenation performed in        %d milliseconds\n",
							System.currentTimeMillis() - startTime);
		} else
			System.out
					.format("\tString.concat() concatenation performed in        x milliseconds\n");
		startTime = System.currentTimeMillis();
		StringBuilder b = new StringBuilder();
		for (int i = 0; i < n; ++i)
			b.append(str);
		b.toString();
		System.out
				.format("\tStringBuilder.append() concatenation performed in %d milliseconds\n",
						System.currentTimeMillis() - startTime);
	}
}

Results:

Performing test with n=10
	StringUtil.repeat() concatenation performed in    0 milliseconds
	String.concat() concatenation performed in        0 milliseconds
	StringBuilder.append() concatenation performed in 0 milliseconds
Performing test with n=100
	StringUtil.repeat() concatenation performed in    0 milliseconds
	String.concat() concatenation performed in        1 milliseconds
	StringBuilder.append() concatenation performed in 0 milliseconds
Performing test with n=1000
	StringUtil.repeat() concatenation performed in    0 milliseconds
	String.concat() concatenation performed in        1 milliseconds
	StringBuilder.append() concatenation performed in 1 milliseconds
Performing test with n=10000
	StringUtil.repeat() concatenation performed in    0 milliseconds
	String.concat() concatenation performed in        43 milliseconds
	StringBuilder.append() concatenation performed in 5 milliseconds
Performing test with n=100000
	StringUtil.repeat() concatenation performed in    0 milliseconds
	String.concat() concatenation performed in        1579 milliseconds
	StringBuilder.append() concatenation performed in 1 milliseconds
Performing test with n=1000000
	StringUtil.repeat() concatenation performed in    0 milliseconds
	String.concat() concatenation performed in        x milliseconds
	StringBuilder.append() concatenation performed in 10 milliseconds
Performing test with n=10000000
	StringUtil.repeat() concatenation performed in    7 milliseconds
	String.concat() concatenation performed in        x milliseconds
	StringBuilder.append() concatenation performed in 112 milliseconds
Performing test with n=100000000
	StringUtil.repeat() concatenation performed in    80 milliseconds
	String.concat() concatenation performed in        x milliseconds
	StringBuilder.append() concatenation performed in 1107 milliseconds
Performing test with n=1000000000
	StringUtil.repeat() concatenation performed in    1372 milliseconds
	String.concat() concatenation performed in        x milliseconds
	StringBuilder.append() concatenation performed in 12125 milliseconds

Conclusion:

  • For large n - use the recursive approach
  • For small n - for loop has sufficient speed

Solution 12 - Java

How about this?

char[] bytes = new char[length];
Arrays.fill(bytes, ' ');
String str = new String(bytes);

Solution 13 - Java

Considering we have:

String c = "c"; // character to repeat, for empty it would be " ";
int n = 4; // number of times to repeat
String EMPTY_STRING = ""; // empty string (can be put in utility class)

Java 8 (Using Stream)

String resultOne = IntStream.range(0,n)
   .mapToObj(i->c).collect(Collectors.joining(EMPTY_STRING)); // cccc

Java 8 (Using nCopies)

String resultTwo = String.join(EMPTY_STRING, Collections.nCopies(n, c)); //cccc

Solution 14 - Java

RandomStringUtils has a provision to create a string from given input size. Cant comment on the speed, but its a one liner.

RandomStringUtils.random(5,"\t");

creates an output

> \t\t\t\t\t

preferable if you dont want to see \0 in your code.

Solution 15 - Java

Use StringUtils: StringUtils.repeat(' ', 10)

Solution 16 - Java

The shortest solution with Guava:

Strings.repeat(" ", len)

Via https://stackoverflow.com/questions/1235179/simple-way-to-repeat-a-string-in-java.

Solution 17 - Java

This worked out for me without using any external libraries in Java 8

String sampleText = "test"
int n = 3;
String output = String.join("", Collections.nCopies(n, sampleText));
System.out.println(output);

And the output is

testtesttest

Solution 18 - Java

int c = 10; String spaces = String.format("%" +c+ "c", ' '); this will solve your problem.

Solution 19 - Java

In most cases you only need Strings upto a certains length, say 100 spaces. You could prepare an array of Strings where the index number is equal to the size of the space-filled string and lookup the string, if the required length is within the limits or create it on demand if it's outside the boundary.

Solution 20 - Java

For good performance, combine answers from aznilamir and from FrustratedWithFormsDesigner

private static final String BLANKS = "                       ";
private static String getBlankLine( int length )
{
    if( length <= BLANKS.length() )
    {
        return BLANKS.substring( 0, length );
    }
    else
    {
        char[] array = new char[ length ];
        Arrays.fill( array, ' ' );
        return new String( array );
    }
}

Adjust size of BLANKS depending on your requirements. My specific BLANKS string is about 200 characters length.

Solution 21 - Java

Just replace your StringBuffer with a StringBuilder. Hard to beat that.

If your length is a big number, you might implement some more efficient (but more clumsy) self-appendding, duplicating the length in each iteration:

 public static String dummyString(char c, int len) {
  if( len < 1 ) return "";
  StringBuilder sb = new StringBuilder(len).append(c);
  int remnant = len - sb.length();
  while(remnant  > 0) {
   if( remnant  >= sb.length() ) sb.append(sb);
   else sb.append(sb.subSequence(0, remnant));
   remnant  = len - sb.length();
  }
  return sb.toString();
 }

Also, you might try the Arrays.fill() aproach (FrustratedWithFormsDesigner's answer).

Solution 22 - Java

You can replace StringBuffer with StringBuilder ( the latter is not synchronized, may be a faster in a single thread app )

And you can create the StringBuilder instance once, instead of creating it each time you need it.

Something like this:

class BuildString {
     private final StringBuilder builder = new StringBuilder();
     public String stringOf( char c , int times ) {
         
         for( int i = 0 ; i < times ; i++  ) {
             builder.append( c );
         }
         String result = builder.toString();
         builder.delete( 0 , builder.length() -1 );
         return result;
      }

  }

And use it like this:

 BuildString createA = new BuildString();
 String empty = createA.stringOf( ' ', 10 );

If you hold your createA as a instance variable, you may save time creating instances.

This is not thread safe, if you have multi threads, each thread should have its own copy.

Solution 23 - Java

Have a method like this. This appends required spaces at the end of the given String to make a given String to length of specific length.

public static String fillSpaces (String str) {
    
    // the spaces string should contain spaces exceeding the max needed
    String spaces = "                                                   ";
    return str + spaces.substring(str.length());
}

Solution 24 - Java

Want String to be of fixed size, so you either pad or truncate, for tabulating data...

class Playground {
    private static String fixStrSize(String s, int n) {
        return String.format("%-" + n + "s", String.format("%." + n +"s", s));
    }
    
    public static void main(String[ ] args) {
        System.out.println("|"+fixStrSize("Hell",8)+"|");
        System.out.println("|"+fixStrSize("Hells Bells Java Smells",8)+"|");
    }
}

|Hell    |
|Hells Be|

Excellent reference here.

Solution 25 - Java

A simple method like below can also be used

public static String padString(String str, int leng,char chr) {
		for (int i = str.length(); i <= leng; i++)
			str += chr;
		return str;
	}

Solution 26 - Java

how about this?

public String fillSpaces(int len) {
    /* the spaces string should contain spaces exceeding the max needed */  
    String spaces = "                                                   ";
    return spaces.substring(0,len);
}

EDIT: I've written a simple code to test the concept and here what i found.

Method 1: adding single space in a loop:

  public String execLoopSingleSpace(int len){
    StringBuilder sb = new StringBuilder();
    
    for(int i=0; i < len; i++) {
        sb.append(' ');
    }
    
    return sb.toString();
  }

Method 2: append 100 spaces and loop, then substring:

  public String execLoopHundredSpaces(int len){
    StringBuilder sb = new StringBuilder("          ")
            .append("          ").append("          ").append("          ")
            .append("          ").append("          ").append("          ")
            .append("          ").append("          ").append("          ");
        
    for (int i=0; i < len/100 ; i++) {
        sb.append("          ")
            .append("          ").append("          ").append("          ")
            .append("          ").append("          ").append("          ")
            .append("          ").append("          ").append("          ");
    }
        
    return sb.toString().substring(0,len);
  }

The result I get creating 12,345,678 spaces:

C:\docs\Projects> java FillSpace 12345678
method 1: append single spaces for 12345678 times. Time taken is **234ms**. Length of String is 12345678
method 2: append 100 spaces for 123456 times. Time taken is **141ms**. Length of String is 12345678
Process java exited with code 0

and for 10,000,000 spaces:

C:\docs\Projects> java FillSpace 10000000
method 1: append single spaces for 10000000 times. Time taken is **157ms**. Length of String is 10000000
method 2: append 100 spaces for 100000 times. Time taken is **109ms**. Length of String is 10000000
Process java exited with code 0

combining direct allocation and iteration always takes less time, on average 60ms less when creating huge spaces. For smaller sizes, both results are negligible.

But please continue to comment :-)

Solution 27 - Java

I know of no built-in method for what you're asking about. However, for a small fixed length like 10, your method should be plenty fast.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionC. RossView Question on Stackoverflow
Solution 1 - JavapolygenelubricantsView Answer on Stackoverflow
Solution 2 - JavamfuchsView Answer on Stackoverflow
Solution 3 - JavaFrustratedWithFormsDesignerView Answer on Stackoverflow
Solution 4 - JavaepoxView Answer on Stackoverflow
Solution 5 - JavakalkinView Answer on Stackoverflow
Solution 6 - JavaVitalii FedorenkoView Answer on Stackoverflow
Solution 7 - JavaBryceCicadaView Answer on Stackoverflow
Solution 8 - JavaSamuel PhilippView Answer on Stackoverflow
Solution 9 - JavameilechhView Answer on Stackoverflow
Solution 10 - JavaAlexey GusevView Answer on Stackoverflow
Solution 11 - JavaNiels BillenView Answer on Stackoverflow
Solution 12 - JavaMartijn CourteauxView Answer on Stackoverflow
Solution 13 - Javaakhil_mittalView Answer on Stackoverflow
Solution 14 - JavaWhimsicalView Answer on Stackoverflow
Solution 15 - JavaIcegrasView Answer on Stackoverflow
Solution 16 - JavaVadzimView Answer on Stackoverflow
Solution 17 - JavaSajan JohnView Answer on Stackoverflow
Solution 18 - JavaMr.GeekyView Answer on Stackoverflow
Solution 19 - JavaAndreas DolkView Answer on Stackoverflow
Solution 20 - JavaoHoView Answer on Stackoverflow
Solution 21 - JavaleonbloyView Answer on Stackoverflow
Solution 22 - JavaOscarRyzView Answer on Stackoverflow
Solution 23 - JavaAnilView Answer on Stackoverflow
Solution 24 - JavaJGFMKView Answer on Stackoverflow
Solution 25 - JavaYashpal SinglaView Answer on Stackoverflow
Solution 26 - JavaaznilamirView Answer on Stackoverflow
Solution 27 - JavaPopsView Answer on Stackoverflow