http://traditio-ru.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BC%D0%B0%D0%BB%D1%8F%D1%80%D0%B0_%D0%A8%D0%BB%D0%B5%D0%BC%D0%B8%D1%8D%D0%BB%D1%8F
http://russian.joelonsoftware.com/Articles/BacktoBasics.html
в RX есть функции работы со строками - GetWordCount и GetWord.
for i := 0 to GetWordCount(aStr) do
doString(GetWord(aStr, i));
Понятно где тут "алгоритм маляра"?
Надеюсь - Америку ни для кого не открыл.
P.S. А тут кстати - самое дело - использовать лямбды. В Delphi XE3 они кстати есть? Я пока - не нашёл... :-(
P.P.S callback и Event - ТОЖЕ можно, но это все знают и БЕЗ меня.
P.P.P.S. Рассказать как это у меня устроено на l3Stub? Или неинтересно?
http://russian.joelonsoftware.com/Articles/BacktoBasics.html
в RX есть функции работы со строками - GetWordCount и GetWord.
for i := 0 to GetWordCount(aStr) do
doString(GetWord(aStr, i));
Понятно где тут "алгоритм маляра"?
Надеюсь - Америку ни для кого не открыл.
P.S. А тут кстати - самое дело - использовать лямбды. В Delphi XE3 они кстати есть? Я пока - не нашёл... :-(
P.P.S callback и Event - ТОЖЕ можно, но это все знают и БЕЗ меня.
P.P.P.S. Рассказать как это у меня устроено на l3Stub? Или неинтересно?
Я даже не знаю, куда тут лямбды прислонить, но у меня есть такой вот алгоритм, для Lazarus, технически, наверное, в Delphi тоже должен заработать (возможно, с минимальными правками):
ОтветитьУдалитьunit ...;
interface
type
TCharSet=set of char;
Const
DefaultWhiteList:TCharSet=['A'..'Z','a'..'z','0'..'9',
// АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЫЭЮЯабвгдеёжзийклмнопрстуфхцчшщъьыэюя
// this is parts of UTF-8 pairs in russian characters presentation
#$80..#$BF,#$D0,#$D1];
type
{ TWordEnumerator }
TWordEnumerator=class
private
fPredIndex,fCurIndex,fLen:integer;
fData:string;
fWhiteList:set of char;
function GetWord:string;{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}
public
property Current:string read GetWord;
function MoveNext:boolean;
function GetEnumerator:TWordEnumerator;{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}
Constructor Create(const Input:string;const WhiteList:TCharSet=[]);
end;
// allow to traverse UTF-8 words in string
// example:
// var C:string;
// For C in WordList('Привет мой безумный мир! Hello my mindless world!') do...
// works only for latin and russian characters by default, for other alphabets,
// WhiteList parameter should be filled with appropriate characters (NOT UTF-8 pairs!)
function WordList(const Input:string;const WhiteList:TCharSet=[]):TWordEnumerator;
implementation
{ TWordEnumerator }
function TWordEnumerator.GetWord: string;
begin
Result:=Copy(fData,fPredIndex,fCurIndex-fPredIndex);
end;
function TWordEnumerator.MoveNext: boolean;
begin
fPredIndex:=fCurIndex;
// skip first non-word characters
while (fPredIndex<=fLen) and (not (fData[fPredIndex] in fWhiteList)) do
Inc(fPredIndex);
// check, that something remains in string
Result:=fPredIndex<=fLen;
if not Result then exit;
// find end of word
fCurIndex:=fPredIndex;
while (fCurIndex<=fLen) and (fData[fCurIndex] in fWhiteList) do
Inc(fCurIndex);
end;
function TWordEnumerator.GetEnumerator: TWordEnumerator;
begin
Result:=Self;
end;
constructor TWordEnumerator.Create(const Input:string;const WhiteList:TCharSet);
begin
inherited Create;
fPredIndex:=1;
fCurIndex:=1;
fData:=Input;
fLen:=Length(Input);
if WhiteList=[] then
fWhiteList:=DefaultWhiteList
else
fWhiteList:=WhiteList;
end;
function WordList(const Input:string;const WhiteList:TCharSet=[]):TWordEnumerator;
begin
Result:=TWordEnumerator.Create(Input,WhiteList);
end;
end.
На большинстве случаев работает, этот код разрабатывался для студента, которому надо было узнать максимальную длину слова в строке... точно знаю, что чувак не сдал, ибо итераторы они ещё не проходили, но я алгоритм сохранил.