Edward Lavaire
Edward Lavaire

Reputation: 31

Substring alternative

So I'm creating a program that will output the first character of a string and then the first character of another string. Then the second character of the first string and the second character of the second string, and so on.

I created what is below, I was just wondering if there is an alternative to this using a loop or something rather than substring

public class Whatever
{
   public static void main(String[] args)
   {
      System.out.println (interleave ("abcdefg", "1234"));
   }
   public static String interleave(String you, String me)
   {
      if (you.length() == 0) return me;
      else if (me.length() == 0) return you;

      return you.substring(0,1) + interleave(me, you.substring(1));
   }
}

OUTPUT: a1b2c3d4efg

Upvotes: 0

Views: 11444

Answers (5)

Mikk
Mikk

Reputation: 571

Improved (in some sense) @BenjaminBoutier answer.

StringBuilder is the most efficient way to concatenate Strings.

public static String interleave(String you, String me) {
    StringBuilder result = new StringBuilder();

    int min = Math.min(you.length(), me.length());
    String longest = you.length() > me.length() ? you : me;

    int i = 0;
    while (i < min) { // mix characters
        result.append(you.charAt(i));
        result.append(me.charAt(i));
        i++;
    }
    while (i < longest.length()) { // add the leading characters of longest
        result.append(longest.charAt(i));
        i++;
    }

    return result.toString();
}

Upvotes: 0

Benjamin Boutier
Benjamin Boutier

Reputation: 1123

This is a loop implementation (not handling null value, just to show the logic):

public static String interleave(String you, String me) {
    StringBuilder result = new StringBuilder();

    for (int i = 0 ; i < Math.max(you.length(), me.length()) ; i++) {
        if (i < you.length()) {
            result.append(you.charAt(i)); }
        if (i < me.length()) {
            result.append(me.charAt(i));
        }
    }

    return result.toString();
}

Upvotes: 1

Necreaux
Necreaux

Reputation: 9776

To implement this as a loop you would have to maintain the position in and keep adding until one finishes then tack the rest on. Any larger sized strings should use a StringBuilder. Something like this (untested):

int i = 0;
String result = "";

while(i <= you.length() && i <= me.length())
{
    result += you.charAt(i) + me.charAt(i);
    i++;
}

if(i == you.length())
    result += me.substring(i);
else
    result += you.substring(i);

Upvotes: 0

theguywhodreams
theguywhodreams

Reputation: 315

Well, if you really don't want to use substrings, you can use String's toCharArray() method, then you can use a StringBuilder to append the chars. With this you can loop through each of the array's indices.

Doing so, this would be the outcome:

public static String interleave(String you, String me) {
    char[] a = you.toCharArray();
    char[] b = me.toCharArray();
    StringBuilder out = new StringBuilder();

    int maxLength = Math.max(a.length, b.length);

    for( int i = 0; i < maxLength; i++ ) {
        if( i < a.length ) out.append(a[i]);
        if( i < b.length ) out.append(b[i]);
    }
    return out.toString();
}

Your code is efficient enough as it is, though. This can be an alternative, if you really want to avoid substrings.

Upvotes: 1

Y123
Y123

Reputation: 977

The solution I am proposing is based on the expected output - In your particular case consider using split method of String since you are interleaving by on character.

So do something like this,

String[] xs = "abcdefg".split("");

String[] ys = "1234".split("");

Now loop over the larger array and ensure interleave ensuring that you perform length checks on the smaller one before accessing.

Upvotes: 0

Related Questions