Ошибок компилятора нет, но строка не изменилась

Я пытаюсь написать программу, которая меняет регистр двух символов в строке (меняет верхний регистр на нижний и наоборот). Она скомпилирована, но строка та же.

String newChar1 = caseChanger("DcoderIsCool", 3); 
String newChar2 = caseChanger("DcoderIsCool", 8);  

Я думаю, проблема в методе, который я использовал:

public static String caseChanger (String s, int ind) {
    if (!(Character.isUpperCase(s.charAt(ind)))) { 
        //checking if the character is uppercase or lowercase
        return s.substring(ind, ind + 1).toLowerCase();
    } else {
        return s.substring(ind, ind + 1).toUpperCase();        
    }
}

Вывод должен был быть "DcoDerIscool", но это "DcoderIsCool" (исходная строка).

Где часть кода, где вы вызываете функцию?

B001ᛦ 15.07.2019 12:42
stackoverflow.com/questions/1552301/…
Murat Karagöz 15.07.2019 12:42

Кроме того, если предположить, что под «ошибками» вы подразумеваете «ошибки компилятора», «ошибок нет» — это довольно низкая планка для очистки. Также нужно проверить наличие логической ошибки, о которой компилятор не может знать.

Federico klez Culloca 15.07.2019 12:45

Проверьте свое условие: если символ нет в верхнем регистре, вы конвертируете его в нижний регистр. Это не кажется правильным...

Federico klez Culloca 15.07.2019 12:47

if (!uppercase) вернуть нижний регистр?

Brian Agnew 15.07.2019 12:47

Ваше условие неверно: удалите из него not !.

Giacomo Alzetta 15.07.2019 12:47

да, извините, я имел в виду ошибки компилятора. Спасибо

BumbleBee 15.07.2019 12:48

это работает сейчас. спасибо всем вам! я не был уверен, что! имел в виду, я скопировал это из ответа на вопрос

BumbleBee 15.07.2019 12:50

Как правило, не используйте код, который вы не понимаете. Это всего лишь один из способов, который может пойти не так. Но могло быть и намного хуже. Кроме того, прочитайте базовый учебник по Java. И удачи в обучении :)

Federico klez Culloca 15.07.2019 12:52

Да, ты прав. Спасибо! я все еще изучаю основы :)

BumbleBee 15.07.2019 12:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
10
97
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я думаю, это то, что вы ищете

public static String caseChanger (String s, int ind) {
    if ((Character.isUpperCase(s.charAt(ind)))) { //checking if the character is uppercase or lowercase

        return new StringBuilder(s).replace(ind,ind+1,s.substring(ind, ind + 1).toLowerCase()).toString();
    }
    else {
        return new StringBuilder(s).replace(ind,ind+1,s.substring(ind, ind + 1).toUpperCase()).toString();        }
}

Таким образом, вы меняете только n символов и возвращаете эти измененные символы рядом с дополнительным not ! вы добавляете, что ваше условие if наоборот. Но то, что вы ищете, - это заменить символы в нужной позиции в исходной строке. если я не ошибаюсь. Надеюсь, поможет

Спасибо! как было предложено, я удалил "!" и теперь это работает, но ваш код более прямолинейный, поэтому я также изменю операторы возврата :)

BumbleBee 15.07.2019 13:05

Используйте StringBuilder, а не StringBuffer. StringBuffer вызывает накладные расходы на синхронизацию для каждого метода, что бесполезно в однопоточной логике и редко приносит пользу даже в многопоточной логике.

VGR 15.07.2019 17:59
Ответ принят как подходящий

Надеюсь, я правильно понял ваш вопрос.

приведенный ниже код даст вам вывод DcoDerIsCool и DcoderIscool.

public static String caseChanger(String s, int ind) {

    char[] charArr = s.toCharArray();

    if (!(Character.isUpperCase(s.charAt(ind)))) {
        charArr[ind] = Character.toUpperCase(s.charAt(ind));
    } else {
        charArr[ind] = Character.toLowerCase(s.charAt(ind));
    }
    return String.valueOf(charArr);
}

Вы извлекли символ из строки, но не поместили его обратно в строку s.substring(ind, ind + 1).toLowerCase() применяется к одному символу

Вместо этого return s.substring(ind, ind + 1).toLowerCase();

Замените символ CaseChanged обратно в исходную строку.

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