The challenge
Write a function called repeat_str
which repeats the given string src
exactly count
times.
repeatStr(6, "I") // "IIIIII" repeatStr(5, "Hello") // "HelloHelloHelloHelloHello"
The solution in Java
Java comes with a built-in
on the String
class. Called repeat
, which allows you to very easily repeat that string n
number of times.
"Hello".repeat(2); // "HelloHello"
Using String::repeat()
Therefore, we could solve our above problem as follows:
class Solution { static String repeatStr(int repeat, String string) { return string.repeat(repeat); } }
Obviously, we probably want to validate our input before we just do it, so maybe wrap it in a ternary:
public class Solution { public static String repeatStr(final int repeat, final String string) { return repeat >= 0 ? string.repeat(repeat) : ""; } }
Write all the code yourself?
Alternatively, you could always just write the method yourself, doing something like this:
public class Solution { public static String repeatStr(final int repeat, final String string) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < repeat; i++) { sb.append(string); } return sb.toString(); } }
Or maybe with less code, like this:
public class Solution { public static String repeatStr(final int repeat, final String string) { String s = ""; for (int i = 0; i < repeat; i++) s += string; return s; } }
Java 8 and above
If you’re feeling Java8 and above thoughts, you could always do this:
public class Solution { public static String repeatStr(final int repeat, final String string) { return java.util.stream.IntStream.range(0, repeat).mapToObj(i -> string) .collect(java.util.stream.Collectors.joining()).toString(); } }
Or maybe combine it with the Collections
nCopies
possible solution:
import java.util.Collections; public class Solution { public static String repeatStr(final int repeat, final String string) { return repeat < 0 ? "" : String.join("", Collections.nCopies(repeat, string)); } }
Test cases to validate
It’s always important to have some tests which will help us validate our application code.
import org.junit.Test; import static org.junit.Assert.assertEquals; import java.util.Random; public class SolutionTest { @Test public void test4a() { assertEquals("aaaa", Solution.repeatStr(4, "a")); } @Test public void test3Hello() { assertEquals("HelloHelloHello", Solution.repeatStr(3, "Hello")); } @Test public void test5empty() { assertEquals("", Solution.repeatStr(5, "")); } @Test public void test0a() { assertEquals("", Solution.repeatStr(0, "kata")); } private final char[] characters = "a[email protected]#$%^&*()-=_+[]{}|;:,.<>/?`~".toCharArray(); @Test public void testRandom() { final Random rand = new Random(); for (int testIteration = 0; testIteration < 10; ++testIteration) { final StringBuilder text = new StringBuilder(rand.nextInt(32)); for (int i = 0; i < text.capacity(); ++i) { final int chi = rand.nextInt(characters.length); text.append(characters[chi]); } final String string = text.toString(); final int timesToRepeat = rand.nextInt(32); final StringBuilder sb = new StringBuilder(timesToRepeat * string.length()); for (int i = 0; i < timesToRepeat; ++i) { sb.append(text); } final String expected = sb.toString(); assertEquals(expected, Solution.repeatStr(timesToRepeat, string)); } } }