Как смешать две строки и сгенерировать другую?

Пользователь введет два строковых значения, 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++;
}

Получите обе строки в качестве входных данных, сравните, какая из них короче. подстроите более длинную строку на длину более короткой. Переберите обе строки символ за символом и создайте новую строку. В конце добавьте оставшуюся подстроку более длинной строки к результату.

VSB 09.04.2019 19:04

Я не уверен, что вы запланировали для этой переменной num, но я подозреваю, что на самом деле происходит не то, что вы ожидаете. Эта строка: char a = s1.charAt(i+num); лучше так: char a = s1.charAt(i);

ck1221 09.04.2019 19:14

Кроме того, когда вы не понимаете, как начать или что делать. Для начала подумайте, как бы вы сделали это на бумаге. А затем преобразовать это в свою программу.

ck1221 09.04.2019 19:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
3
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать 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

Вот еще одна реализация, также использующая 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
???????

Как видите, этот код не может обрабатывать символы вне базовой многоязычной плоскости, поскольку они хранятся в виде суррогатной пары символов. Чтобы поддержать это, вы можете изменить код следующим образом (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
?????

Другие вопросы по теме