Мы знаем, что в Java есть StringTokenizer, который очень удобен для обработки строк, но эта функция не предусмотрена в Delphi. Для реализации этой функции я ссылаюсь на версию Delphi и версию языка Java C#. Надеюсь предоставить вам удобство. Надеюсь, вы дадите мне еще совет. [email protected]
модуль SkyStringTokenizer;
{Класс анализа и обработки строк
Автор: Цзэн Цинсун
Время: 21 февраля 2004 г. (Канун Нового года, 2003 г.)
}
интерфейс
использует
SysUtils, Классы;
тип
IIитератор = интерфейс
функция hasNext(): логическое значение;
функция next(): строка;
конец;
тип
TSkyStringTokenizer = класс (TComponent, IIterator)
Частный
токены: TStringList;
индекс: целое число;
данные: строка;
разделитель: строка;
процедура init (dataLine: строка; разделитель: строка);
функция CharacterInTokens (ch: string; const sl: TStringList): логическое значение;
функция StringToCharArray (разделитель: строка): TStringList;
функция SplitString (источник, ch: строка): Tstringlist;
защищенный
{ Защищенные объявления }
общественный
{Публичные заявления}
конструктор create (dataLine: строка перегрузки);
конструктор Create (dataLine: string; delim: перегрузка строки);
деструктор уничтожить();переопределить;
функция hasNext(): логическое значение;
функция next(): строка;
опубликовано
{ Опубликованные декларации }
конец;
процедура Регистр;
выполнение
процедура Регистр;
начинать
RegisterComponents('SkyDevKit', [TSkyStringTokenizer]);
конец;
{ TStringTokenizer }
функция TSkyStringTokenizer.hasNext: логическое значение;
начинать
результат := (индекс < токены.Count - 1);
конец;
процедура TSkyStringTokenizer.init(dataLine, delim: string);
начинать
токены:= TStringList.Create();
разделитель := разделитель;
данные: = строка данных;
токены:= SplitString(данные, разделитель);
// токены: = data.Split(delimiter.ToCharArray());
индекс := -1;
конец;
функция TSkyStringTokenizer.next: строка;
вар
с: строка;
начинать
вкл (индекс);
s := токены[индекс];
while ((длина(ы) <= 0) и (индекс < tokens.Count)) делают
начинать
вкл (индекс);
s := токены[индекс];
конец;
результат := с;
конец;
функция TSkyStringTokenizer.StringToCharArray(delim: string): TStringList;
вар
сл: TStringList;
Я: целое число;
начинать
сл := TStringList.Create();
for I := 1 to length(delim) do // Итерация
начинать
sl.Append(copy(delim, i, 1));
конец // для
результат := сл;
конец;
конструктор TSkyStringTokenizer.Create(dataLine, delim: string);
начинать
унаследовано Create(nil);
self.init(dataLine, разделитель);
конец;
конструктор TSkyStringTokenizer.Create(dataLine: string);
начинать
унаследовано Create(nil);
self.init(dataLine, '');
конец;
функция TSkyStringTokenizer.SplitString(source, ch: string): tstringlist;
вар
температура: строка;
//я: целое число;
сл: TStringList;
индекс: целое число;
начинать
если ch = '' тогда
ч := '';
сл := TStringList.Create();
результат: = tstringlist.Create();
сл:= self.StringToCharArray(ch);
темп := '';
for Index := 1 to length(source) do // Итерация
начинать
если не CharacterInTokens(source[index], sl), то
начинать
temp := temp + источник[Индекс];
конец
еще
начинать
результат.Добавить(темп);
темп := '';
конец; // если
конец // для
если (temp <> ''), то
результат.Добавить(темп);
сл.Бесплатно;
конец;
функция TSkyStringTokenizer.CharacterInTokens(ch: string;
const sl: TStringList): логическое значение;
вар
индекс: целое число;
// Я: Целое число;
начинать
результат: = ложь;
for Index:= от 0 до sl.Count - 1 do // Итерация
начинать
результат := результат или (ch = sl[Индекс]);
{если ch = sl[индекс] тогда
начинать
результат: = правда;
перерыв;
конец;
}
конец // для
конец;
деструктор TSkyStringTokenizer.destroy;
начинать
жетоны.Бесплатно;
унаследованный;
конец;
конец.
//Далее представлена версия C#, первоначальная версия не была написана мной
использование системы;
пространство имен CsharpPats
{
//Класс токенизатора строк
общественный класс StringTokenizer {
данные частной строки, разделитель;
токены частной строки[];
частный индекс int;
public StringTokenizer (строка dataLine) {
init(dataLine, " ");
}
Private void init (String dataLine, string delim) {
разделитель = разделитель;
данные = линия данных;
токены = data.Split (delimiter.ToCharArray());
индекс = 0;
}
public StringTokenizer (строка dataLine, строка-разделитель) {
инициализация (dataLine, разделитель);
}
public bool hasMoreElements() {
return (индекс <(tokens.Length));
}
публичная строка nextElement() {
строка s = токены[индекс++];
while((s.Length <=0) && (index<tokens.Length))
s = токены[индекс++];
вернуть с;
}
}
}