Java для цикла 1-й символ 1-й строки, а затем последний символ второй строки

1

когда я ввожу две строки равной длины, мой код работает просто отлично, но когда я делаю это как разную длину строк, он говорит о 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);
Теги:

4 ответа

1
Лучший ответ

Вам необходимо выполнить проверку границ:

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) : "");
}

но я рекомендую первую версию, которая яснее.

  • 0
    Спасибо за твой ответ. Я думал о решении, как 1 неделю, и не придумал правильную логику.
0

Я бы использовал 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();

И результат тот же.

  • 0
    спасибо, но я избегаю StringBuilder и любых других объектов. потому что я использую Java и Javascript, чтобы проверить это.
0

Попробуй это

Код

    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 цикла после первого цикла должны продолжаться, когда одна из строк имеет большую длину. Первый цикл завершается, когда достигнут один из концов строки

  • 0
    о, я должен изучить цикл без инициализации хе-хе.
0

У вас есть логическая ошибка:

i <= name1.length() || i <= name2.length()

Вы дойдете до конца длинной строки. Вы продолжаете, если в строке есть буквы, поэтому вы останавливаетесь, когда обе строки завершены. Но если строки имеют разные длины, вы продолжаете идти даже после передачи одной строки.

Пытаться:

i <= name1.length() && i <= name2.length()
  • 0
    Это не логическая ошибка. OP хочет, чтобы цикл продолжался, если у кого-либо еще есть буквы (см. Желаемый результат).
  • 0
    && не работает, когда я помещаю это в условие

Ещё вопросы

Сообщество Overcoder
Наверх
Меню