如何混合两个字符串并生成另一个?

时间:2019-04-09 16:55:53

标签: java string

用户将输入两个字符串值,a和b。我的代码将创建一个更大的字符串,该字符串由a的第一个字符,b的第一个字符,a的第二个字符,b的第二个字符组成,依此类推。任何剩余的字符都放在结果的末尾。我该怎么做最简单的方法?我对如何开始感到困惑。

System.out.print("Enter 2 words");
String s1 = input.nextLine();
String s2 = input.nextLine();
int num = 0;
for (int i = 0; i<s1.length();i++) {    
    char a = s1.charAt(i+num);
    num++;
}

2 个答案:

答案 0 :(得分:1)

您可以使用StringBuilder来实现:

StringBuilder result = new StringBuilder(s1);
for (int i = 0; i < s2.length(); i++) {
    result.insert(Math.min(i * 2 + 1, result.length()), s2.charAt(i));
}
System.out.println(result.toString());

首先,创建一个StringBuilder,其字符串为s1作为输入。现在,您可以遍历字符串s2的长度,并将每个字符插入result中。 Math.min()用于防止StringIndexOutOfBoundsException

s1 = "TEST"s2 = "test"的结果是:

  

TtEeSsTt

s1 = "TESTASDF"s2 = "test"的结果是:

  

TtEeSsTtASDF

s1 = "TEST"s2 = "testasdf"的结果是:

  

TtEeSsTtasdf

答案 1 :(得分:1)

这是另一种实现方式,也使用StringBuilder,但是通过仅使用append()而不是insert()来减少字符移动。

static String mix(String s1, String s2) {
    int len = Math.min(s1.length(), s2.length());
    StringBuilder buf = new StringBuilder();
    for (int i = 0; i < len; i++) {
        buf.append(s1.charAt(i)).append(s2.charAt(i));
    }
    return buf.append(s1.substring(len)).append(s2.substring(len)).toString();
}

基本上,它将两个输入都起作用的部分的结果附加字符,然后从较长的输入中附加其余部分(依靠substring(len)从较短的输入中返回空字符串)。

测试

System.out.println(mix("TEST", "test"));
System.out.println(mix("TESTASDF", "test"));
System.out.println(mix("TEST", "testasdf"));
System.out.println(mix("", ""));

输出

TtEeSsTt
TtEeSsTtASDF
TtEeSsTtasdf
????

如您所见,该代码无法处理Basic Multilingual Plane之外的字符,因为这些字符存储为一对替代字符。为此,您可以更改为以下代码(Java 8 +):

static String mix(String s1, String s2) {
    int[] a1 = s1.codePoints().toArray();
    int[] a2 = s2.codePoints().toArray();
    int[] r = new int[a1.length + a2.length];
    for (int i1 = 0, i2 = 0, j = 0; j < r.length; ) {
        if (i1 < a1.length)
            r[j++] = a1[i1++];
        if (i2 < a2.length)
            r[j++] = a2[i2++];
    }
    return new String(r, 0, r.length);
}

输出

TtEeSsTt
TtEeSsTtASDF
TtEeSsTtasdf