Я думаю, что самое простое (с почти нулевым объемом памяти) - это просто отсканировать строку самостоятельно:
int findLastCharBeforeChar(final String string, final char anchor, final char needle) {
int i = string.length() - 1;
while (i >= 0 && string.charAt(i) != anchor) {
--i;
}
while (i >= 0) {
if (string.charAt(i) == needle) return i;
--i;
}
return i;
}
Если вы хотите сделать это немного короче (но, вероятно, минимально медленнее и определенно труднее прочитайте):
int findLastCharBeforeChar(final String string, final char anchor, final char needle) {
char target = anchor;
while (i >= 0) {
final char ch = string.charAt(i);
if (ch == target) target = needle;
if (target == needle && ch == target) return i;
--i;
}
return i;
}
Не то, что было задано (наиболее эффективно), но в комментариях было указано «самое короткое» решение, вот вам go (обратите внимание, что это далеко не эффективно и в зависимости от того, где вы его называете, это может быть плохо):
string.split('b')[0].lastIndexOf('2');
Вы не указали в своем OP, что должно произойти, если 'b'
не является частью входной строки. Должен ли результат быть -1
? (будет с моей первой реализацией) или тогда метод должен просто вернуть индекс последней '2'
в строке (решение для разделения строк)? Изменение способа обрабатывать этот случай, а тривиально, просто проверить, если первый л oop прекращается при -1
и сбросить индекс для последнего индекса струны.
1016 * Но это несколько спорный вопрос. Вы помещаете в метод 9 строк кода, пишете для него соответствующие модульные тесты и затем вызываете свой новый метод. Вызов нового метода: а) однострочный б) эффективный c), который может быть встроен JVM