Всем привет! Подскажите, пожалуйста, есть ли встроенная функция для подсчёта количества непересекающихся вхождений подстроки в строку. Например, для подстроки ‘ABA’ и строки ‘ABABA’ возвращающая 1?
Понятно, что можно эту функцию вручную описать с использованием, например, Pos, но мой вопрос как раз в том, есть ли втроенная, готовая функция?
Знаю, что есть метод CountOf для строковых переменных, но он считает только количество вхождений односимвольных строк (или точнее char?) в строку.
##
var s := 'ABABA';
s.IndicesOf('ABA').Count.Print
Вызов со вторым параметром IndicesOf('ABA', True) вернет количество вхождений с учетом пересечений. Реализация - КМП-алгоритм, так что эффективно работает и для строк с безумной длиной.
Пожалуйста. Еще можно написать регулярное выражение, найти все его вхождения посредством MatchValues и подсчитать их количество. Для коротких строк может оказаться наиболее быстрым решением.
Действительно работает. А тут я попробовал в FPC такое сделать, но перед этим задал тип TAi = array if integer и там элементы изменять в подпрограмме было можно. Но если же в подпрограмме указать тип параметра массива как array of integer, то также заработало. Здесь и так и эдак изменять элементы нельзя.
Массив в PascalАВС.NЕТ имеет ссылочный тип. Если его в подпрограмме описать как var - можно будет там создать другой массив и подсунуть его вместо аргумента. Это как дать коробку конфет, а взамен получить мешочек с бочонками лото. Если var не указывать, можно проделывать с массивом все то, что не меняет ссылку на сам массив. Т.е. оболочку сохраняем, содержимое можем менять. Дали коробку с конфетами - возвращаем эту же коробку, хоть с понадкусанными, но все же с конфетами. И, наконец, const говорит о том, что тебе дали музейный экспонат: полюбовался, языком поцокал - и вернул в целости и сохранности.
Видимо, нет. В некоторых случаях можно исхитриться и использовать FillPolygon, но это жутко неудобно. Возможно, и это, и Curve из GraphABC сложно реализовать в WPF.