Пользователь введет два строковых значения, 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++;
}
Я не уверен, что вы запланировали для этой переменной num, но я подозреваю, что на самом деле происходит не то, что вы ожидаете. Эта строка: char a = s1.charAt(i+num); лучше так: char a = s1.charAt(i);
Кроме того, когда вы не понимаете, как начать или что делать. Для начала подумайте, как бы вы сделали это на бумаге. А затем преобразовать это в свою программу.
Вы можете использовать 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
?????
Получите обе строки в качестве входных данных, сравните, какая из них короче. подстроите более длинную строку на длину более короткой. Переберите обе строки символ за символом и создайте новую строку. В конце добавьте оставшуюся подстроку более длинной строки к результату.