Удаление всего после определенного символа (IndexOfAny и Remove) - PullRequest
1 голос
/ 26 марта 2011

У меня есть следующий строковый массив (amountInForPriceBandPopUp [3]) data:

10 - 24
25 - 99
100 - 249 
5000+

В C #, если я добавлю этот массив через это:

quantityInForPriceBandPopUp[i] = quantityInForPriceBandPopUp[i].Remove(quantityInForPriceBandPopUp[i].IndexOfAny(new char[] { ' ', '+' }));

Я получу это:

10
25
100
5000

Как мне достичь того же результата в Java?В идеале я ищу ответ в одну строку.Если это невозможно, то самый короткий будет работать.

Ответы [ 3 ]

2 голосов
/ 26 марта 2011

Нет эффективного однострочного ответа, потому что в java.lang.String API нет прямого эквивалента indexOfAny.

Вот эффективный эквивалент в паре строк.

int pos = Math.min(Math.max(s.indexOf(' '), -1), Math.max(s.indexOf('+'), -1));
if (pos != -1) {
    s = s.substring(0, pos);
}

И вы можете легко превратить это в статический вспомогательный метод.

2 голосов
/ 26 марта 2011

Посмотрите на http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/StringUtils.html

Имеет метод indexOfAny и многие другие строковые методы

1 голос
/ 26 марта 2011

Возможно, не самый эффективный, но вы можете использовать регулярные выражения и replaceFirst

for (int i = 0; i < arr.length; i++)
{
  arr[i] = arr[i].replaceFirst("( |\\+).*$","");
}

По сути, он находит первый экземпляр либо пробела ' ', либо знака плюс +, который мы должны были экранировать с двумя \, поскольку + также является специальным символом в регулярных выражениях наряду с другие символы, следующие за ним .* до конца $, и заменяют его пустой строкой.

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

  arr[i] = arr[i].replaceFirst("( |\\+|\\.).*$","");

Теперь это скомпилирует новое регулярное выражение Pattern каждого цикла, что определенно не идеально, если в вашем массиве много строк. В этом случае вы можете сначала скомпилировать отдельный шаблон вне цикла:

Pattern pattern = Pattern.compile("( |\\+).*$");
for (int i = 0; i < arr.length; i++)
{
  arr[i] = pattern.matcher(arr[i]).replaceFirst("");
}

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

for (int i = 0; i < arr.length; i++)
{
  arr[i] = arr[i].replaceFirst("^.*( |\\+)\\s*","");
}

Обратите внимание, это необходимо изменить, если вы все еще хотите захватить "5000" для "5000+".

Может быть стоит создать отдельное универсальное регулярное выражение, которое использует "\ d +" для поиска чисел, например:

^(\\d+).*((\\d+)?)$

Тогда вам нужно использовать Matcher и Matcher.group , чтобы выбрать конкретные числа.

Ссылки по теме :

Строка документации

Образец документации

Соответствующая документация

Регулярные выражения в Java

Википедия по регулярным выражениям

...