Поиск последнего символа перед данным символом внутри строки Java - PullRequest
0 голосов
/ 26 апреля 2020

Скажем, у меня есть следующая строка:

String string = "122045b5423";

В Java, что было бы наиболее эффективным способом найти последние 2 перед b? Я знаю, что могу разбить строку и затем использовать метод lastIndexOf () из класса String, но есть ли более эффективный способ с меньшим количеством создания переменных. Может ли существовать метод в классе StringBuilder, который позволит нам сделать это?

Ответы [ 3 ]

0 голосов
/ 26 апреля 2020

Если вы ищете более компактное решение, как насчет регулярных выражений?

// A 2, followed by arbitrary chars that are not a 2 and finally a b
Pattern pattern = Pattern.compile("(2)[^2]*b");
Matcher matcher = pattern.matcher(string);

if (matcher.find()) {
    System.out.print("Start index: " + matcher.start());
    System.out.print(" End index: " + matcher.end());
    System.out.println(" Found: " + matcher.group());
}

Не тестировали его, но что-то подобное должно работать

0 голосов
/ 26 апреля 2020

Посмотрите на метод подстрока класса String (или подпоследовательность ). Это должно дать вам то, что вам нужно.

код должен быть примерно таким

String result = null;
int index = myString.indexOf("b");
if(index > -1) {
  if(index >= 2) {
    result = myString.substring(index - 2, index);
  } else {
    result = myString.substring(0, index);
  }
}
0 голосов
/ 26 апреля 2020

Я думаю, что самое простое (с почти нулевым объемом памяти) - это просто отсканировать строку самостоятельно:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...