когда я ввожу две строки равной длины, мой код работает просто отлично, но когда я делаю это как разную длину строк, он говорит о StringIndexOutOfBoundsException.
вот мой код... Мне нужно вывести a5b4c3d21, это не домашнее задание, я просто изучаю манипуляции с строками для цикла. заранее благодарю.
String name1 = "abcd";
String name2 = "12345";
String temp = "";
for (int i = 1; i <= name1.length() || i <= name2.length(); i++) {
temp = temp + name1.charAt(i-1) + name2.charAt(name2.length()-i);
}
System.out.println(temp);
Вам необходимо выполнить проверку границ:
for (int i = 1; i <= name1.length() || i <= name2.length(); i++) {
if (i <= name1.length()) {
temp += name1.charAt(i - 1);
}
if (i <= name2.length()) {
temp += name2.charAt(name2.length() - i);
}
}
Вы можете использовать условный оператор, чтобы сделать его немного менее подробным:
for (int i = 1; i <= name1.length() || i <= name2.length(); i++) {
temp += (i <= name1.length() ? name1.charAt(i - 1) : "") +
(i <= name2.length() ? name2.charAt(name2.length() - i) : "");
}
но я рекомендую первую версию, которая яснее.
Я бы использовал Math.max(int,int)
чтобы получить большую длину String
. И итерация от 0 до длины большей String
. Проверьте, если каждая позиция меньше, чем последний символ String name1
если это так печатает этот символ. Затем проверьте name2
. подобно
String name1 = "abcd";
String name2 = "12345";
for (int i = 0, len = Math.max(name1.length(), name2.length()); i < len; i++) {
if (i < name1.length()) {
System.out.print(name1.charAt(i));
}
if (i < name2.length()) {
System.out.print(name2.charAt(name2.length() - i - 1));
}
}
System.out.println();
Выход (по запросу)
a5b4c3d21
Мы могли бы упростить математику во втором if
использовать StringBuilder
и reverse()
как
String name1 = "abcd";
String name2 = "12345";
StringBuilder sb = new StringBuilder(name2);
sb.reverse();
for (int i = 0, len = Math.max(name1.length(), sb.length()); i < len; i++) {
if (i < name1.length()) {
System.out.print(name1.charAt(i));
}
if (i < sb.length()) {
System.out.print(sb.charAt(i));
}
}
System.out.println();
И результат тот же.
Попробуй это
String name1 = "abcd";
String name2 = "12345";
String temp = "";
int i;
for (i = 0; i < name1.length() && i < name2.length(); i++) {
temp = temp + name1.charAt(i) + name2.charAt(name2.length()-i-1);
}
for (; i < name1.length(); i++) {
temp = temp + name1.charAt(i);
}
for (; i < name2.length(); i++) {
temp = temp + name2.charAt(name2.length()-i-1);
}
System.out.println(temp);
a5b4c3d21
2 цикла после первого цикла должны продолжаться, когда одна из строк имеет большую длину. Первый цикл завершается, когда достигнут один из концов строки
У вас есть логическая ошибка:
i <= name1.length() || i <= name2.length()
Вы дойдете до конца длинной строки. Вы продолжаете, если в строке есть буквы, поэтому вы останавливаетесь, когда обе строки завершены. Но если строки имеют разные длины, вы продолжаете идти даже после передачи одной строки.
Пытаться:
i <= name1.length() && i <= name2.length()