Вспомогательный метод: удваивает символы в строке, но останавливает рекурсию после первого символа - PullRequest
0 голосов
/ 06 мая 2019

Это домашнее задание, на котором я застрял. Я даю ArrayList и мне нужно вернуть String со всеми удвоенными символами. Вход: abc, Выход: aabbcc. Что я получаю, так как мой вывод аа, то он останавливается. Я делал это несколько раз с циклом, но я не могу получить это с помощью рекурсии.

Я попытался повторно отредактировать свой код, а также попытался использовать счетчик, но я либо получаю нулевое возвращение, либо получу ошибку потока overstack. Я пошел на веб-сайт Oracles, чтобы выяснить, какие другие методы String я мог бы использовать, и попытался изменить свой код другими методами, но все равно не повезло.

Мои другие методы работают с превращением ArrayList в строку, но это мой последний метод, с которым у меня проблемы.

public String dupEachChar2(String str) {
    //str is going to be a string with abc in it.
    String x = "";
    int count = 0;

    // I'm checking if there is only 1 char, if so just return it twice to 1 string.
    if(str.length() == 1) {
        return str + str;
    } else if(count != str.length()) {
        //Doubling part that I can not figure out.
        x += str.substring(count, count+1) + str.substring(count, count+1);
        count++;
        dupEachChar2(str.substring(count));
    }
    return x;
}

Ответы [ 2 ]

3 голосов
/ 06 мая 2019

Вы можете использовать функцию обратной ссылки String.replaceAll (). Чтобы заменить каждый символ строки дубликатами, выполните следующие действия:

String a = "abc";
String b = a.replaceAll("(.)", "$1$1");
b is now equals to aabbcc

Вот как это работает.

  • . означает совпадение с любым символом, а () - захват группы для регулярного выражения.
  • $1 означает получить то, что было сопоставлено в первой (т.е. # 1) группе. Затем просто используйте его дважды, чтобы удвоить символ.
2 голосов
/ 06 мая 2019

попробуйте это

public String dupEachChar2(String str) {

        if(str.length() == 1) 
            return str + str;
        else 
            return str.substring(0,1)+str.substring(0,1)+dupEachChar2(str.substring(1));
    }
}

проблема с вашим кодом заключается в том, что вы рассматриваете переменную x (и число), как если бы она распределялась между каждым экземпляром метода, хотя на самом деле это новыйпеременная для каждого вызова этого метода.Кроме того, вам здесь не нужна переменная x, потому что вы намеревались хранить всю новую строку, но вы уже получили ее из значения, возвращенного предыдущей итерацией вашего рекурсивного метода.Что касается подсчета, вы можете просто посмотреть, сколько символов осталось в строке (каждый раз обрезая по одному) и останавливаясь, когда они достигают 1.

Если вы приложите минимальное количество усилий, чтобычтобы ваш код функционировал правильно, я бы сказал, передайте x в качестве второго параметра и используйте «» при первом вызове из любого места.

...