LastIndexOf в Java ищет с конца строки? - PullRequest
5 голосов
/ 17 ноября 2011

Я гуглял и пытался выяснить, каково поведение lastIndexOf, но не могу найти ответ на него ...

У меня есть потенциально большая строка, которую мне нужно найти, и я на 99% уверен, что тег, например: </data>, будет в конце. Я пытаюсь удалить это и добавить в строку некоторые дополнительные данные, а затем снова закрыть их.

Прямо сейчас я использую indexOf, но производительность здесь - мой главный приоритет, поэтому я подумал об использовании lastIndexOf ...

Может ли какой-нибудь эксперт по Java подтвердить, будет ли lastIndexOf выполнять поиск в конце строки?

Пример:

xml = xml.substring(0, xml.lastIndexOf("</data>"));
xml+"<mystuff>hello world</mysruff>";
xml+"</data>";

Ответы [ 3 ]

10 голосов
/ 17 ноября 2011

Из JavaDoc :

int lastIndexOf (String str, int fromIndex) Возвращает индекс в этой строке последнего вхождения указанной подстроки с обратным поиском, начиная с указанного индекса.

4 голосов
/ 17 ноября 2011

Исходя из источника, найденного здесь , это выглядит так, как будто lastIndexOf перемещается от конца строки к началу.Выдержка размещена ниже для удобства;обратите внимание на операции декремента, поскольку он отслеживает i и j, чтобы найти последнее совпадение.

startSearchForLastChar: while (true) {
    while (i >= min && source[i] != strLastChar) {
        i--;
    }
    if (i < min) {
        return -1;
    }
    int j = i - 1;
    int start = j - (targetCount - 1);
    int k = strLastIndex - 1;

    while (j > start) {
        if (source[j--] != target[k--]) {
            i--;
            continue startSearchForLastChar;
        }
    }
    return start - sourceOffset + 1;
}
0 голосов
/ 17 ноября 2011

Из Javadoc :

Возвращает индекс в этой строке последнего вхождения указанный персонаж. Для значений ch в диапазоне от 0 до 0xFFFF (включительно), индекс (в единицах кода Unicode) является наибольшим значение k такое, что:

this.charAt(k) == ch

верно. Для других значений ch это наибольшее значение k такое, что:

this.codePointAt(k) == ch

верно. В любом случае, если в этой строке нет такого символа, тогда -1 возвращается. Строка ищется задом наперед, начиная с последний символ.

Так что да, это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...