Заменить строки определенным списком слов - PullRequest
0 голосов
/ 17 апреля 2019

Заменить данную строку по указанному индексу списком слов.Постановка проблемы приведена ниже. Может ли кто-нибудь дать мне некоторую интуицию или идею, как действовать в этом направлении?

//A replacement class similar to Linked List
class Replacement {
        int start;
        String before;
        String after;

    //Method to replace the words
    public static String replaceRanges(String text, List<Replacement> replacements) {
        //TODO your code here
        return null;
    }

}

/* below is the example of the problem
    Example #1:
    Input: 
    text = "num foo"
    replacements = [
    {start: 0, before: "num", after: "String"},
    {start: 4, before: "foo", after: "bar"}
    ]
    Output:
    replaceRanges(text, replacements) returns:
    "String bar"
    Example #2: Input: text = "num_fooBar", Output: "String_barBar"
*/

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

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

public String replaceRanges(String text, List<Replacement> replacements) {
    for(int i = 0; i < replacements.size(); i++) {
        Replacement replacement = replacements.get(i);
        String firstPart = text.substring(0, replacement.start);
        String secondPart = text.substring(replacement.start, text.length());
        String updatedSecondPart = secondPart.replace(replacement.before, replacement.after);
        text = firstPart + updatedSecondPart;
        updateStart(i + 1, replacements, updatedSecondPart.length() - secondPart.length());
    }
    return text;
}

privat void updateStart(int startIndex, List<Replacement> replacements, int shift) {
    for( int i = startIndex; i < replacements.size(); i++) {
        Replacement r = replacements.get(i);
        r.start += shift;
    }
}

Используя этот метод, вы можете обработать:

Replacement r1 = new Replacement(0, "hi", "Hello");
Replacement r2 = new Replacement(2, "lo", "p");
Sting result = replaceRanges("hi louie!", asList(r1, r2)); //result = 'Hello puie!'
0 голосов
/ 17 апреля 2019

Если у вас есть замены, отсортированные от наименьшего индекса к наивысшему, вы можете перебирать список с последнего на первый, искать подстроки во входной строке и заменять их, если они соответствуют

public static String replaceRanges(String text, List<Replacement> replacements) {
    StringBuilder s = new StringBuilder(text);

    for (int i = replacements.size() - 1; i>=0; i--) {
        Replacement r = replacements.get(i);
        int begin = r.start;
        int end = r.start + r.before.length();
        if (begin >= 0 && begin < s.length() && end >= 0 && end <= s.length()) {
            if (s.substring(begin, end).equals(r.before)) {
                s.replace(begin, end, r.after);
            }
        }
    }

    return s.toString();
}

Если ваш списокне отсортировано, сначала нужно отсортировать его, используя Collections.sort().

Я использовал этот код для тестирования:

public static void main(String[] args) {
    List<Replacement> replacements = List.of(
            new Replacement(0, "num", "String"), 
            new Replacement(4, "foo", "bar"));

    System.out.println(replaceRanges("num foo", replacements)); // Output: String bar
    System.out.println(replaceRanges("num_fooBar", replacements)); // Output: String_barBar
    System.out.println(replaceRanges("num_f", replacements)); // Output: String_f
    System.out.println(replaceRanges("", replacements)); // Output: 
    System.out.println(replaceRanges("foonum", replacements)); // Output: foonum
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...