Текущий архив: 2004.01.13;
Скачать: CL | DM;
ВнизКак можно разбить строку на символы? Найти похожие ветки
← →
имя (2003-12-20 23:26) [40]Удалено модератором
← →
Ломброзо (2003-12-20 23:31) [41]LMD и RTFM
← →
имя (2003-12-20 23:36) [42]Удалено модератором
← →
Ломброзо (2003-12-20 23:45) [43]Аспейсиба, я не знал.
← →
Ломброзо (2003-12-20 23:49) [44]Подозрительный сайтик. Поместите егой в топку.
← →
kaif (2003-12-21 04:17) [45]z.Evgen (19.12.03 08:45)
Имеется переменная String как ее разбить на символы?
Делением пополам!
Сначала разбиваешь на символы до length div 2 и после length div 2, затем рекурсивно вызываешь эту процедуру для каждой половины. И так, пока не останется один символ. Это самый правильный и крутой метод. Так как все правильные методы используют деление отрезка пополам, а все крутые методы используют рекурсивные вызовы.
К тому же при пошлых и тривиальных решениях тебе пришлось бы резервировать ресурс под переменную для цикла for:
var
i: integer;
Рекурсивный вызов позволяет этого избежать и поэтому экономит минимум 4 байта оперативной памяти, отводимой под эту переменную.
И тебе не придется думать о длине этой переменной! И длине строки тоже!
ИМХО, реализация с рекурсивным вызовом самая универсальная, так как даже с переходом на платформы Win64, Win128 и Win256 исходный код не придется менять.
Существуют объектно-ориентированные языки программирования, в которых вообще нет циклов и все делается вызовом рекурсивных процедур. Так что этот код еще легко будет переводить на такие языки, что делает его универсальным.
← →
Knight (2003-12-21 19:59) [46]Люди... Можно как-то избавиться от объявления типа, но чтобы при этом функция продолжала работать? И вообще, доработайте кто что может. :)
type TStrArr=Array of String;
function Explode(Sep:Boolean; Str:String):TStrArr;
var i,Len:Integer;
S:String;
begin
Result:=nil;
Len:=Length(Str);
if not Sep then begin
SetLength(Result,Len);
for i:=1 to Len do begin
Result[i-1]:=Str[i];
end;
end else if (Sep and (Len>0)) then begin
S:="";
for i:=2 to Len do begin
if (Str[i]=Str[1]) then begin
SetLength(Result,Length(Result)+1);
Result[High(Result)]:=S;
S:="";
end else if (i=Len) then begin
SetLength(Result,Length(Result)+1);
Result[High(Result)]:=S+Str[i];
end else S:=S+Str[i];
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var A:TStrArr;
i:Integer;
begin
Memo1.Clear;
A:=Explode(false," Имеется переменная String как ее разбить на символы?");
for i:=0 to Length(A)-1 do Memo1.Lines.Append(A[i]);
A:=nil;
end;
← →
имя (2003-12-21 21:20) [47]Удалено модератором
← →
Knight (2003-12-21 21:42) [48]Немного подправил разбивку по сепаратору... стало немного короче :)
Для тех кто не понял кода... Sep-указывает, что первый символ использовать как разделитель и бить строку по нему, если он False, то строка Str бьётся на символы...
function Explode(Sep:Boolean; Str:String):TStrArr;
var i,k,Len:Integer;
begin
Result:=nil;
Len:=Length(Str);
if not Sep then begin
SetLength(Result,Len);
for i:=1 to Len do begin
Result[i-1]:=Str[i];
end;
end else if (Sep and (Len>0)) then begin
k:=1;
for i:=2 to Len+1 do begin
if (i=Len+1) or (Str[i]=Str[1]) then begin
SetLength(Result,Length(Result)+1);
Result[High(Result)]:=Copy(Str,k+1,i-k-1);
k:=i;
end;
end;
end;
end;
← →
Knight (2003-12-21 21:56) [49]Что? Как потрепаться, так народу куча, а как... так никого? :(
← →
Nous Mellon (2003-12-21 22:05) [50]
> Что? Как потрепаться, так народу куча, а как... так никого?
> :(
Фишка в том что трепка расслабляет, а когда надо писать код думаешь может лучше полезть в свой незаконченный проект и сделать там что-нибудь полезное чем давать прикольные, но в общем то ненужные советы
← →
Knight (2003-12-21 22:37) [51]>> Nous Mellon © (21.12.03 22:05) [50]
А при чём тут приколы? Я на полном серьёзе... :|
Понадобилась функция, аналогичная Explode в PHP, для разбивки стринга, заодно и сюда закинул.
← →
SergP (2003-12-22 02:24) [52]
> Knight © (21.12.03 21:56) [49]
> Что? Как потрепаться, так народу куча, а как... так никого?
> :(
Вот-вот... Стоит задать серьезный вопрос как все начинают его игнорировать... А потрепаться - то все слетаются как мухи на ... мед. Удивляюсь только как это всем не лень приводить такие длинные коды, это же написать такое нужно сначала!!! Причем с целью просто поприкалываться
...Может я свои вопросы неправильно формулирую... Нужно будет попробовать методом сабжа... Тогда и ответов куча будет. (Правда бесполезных) :-(
Страницы: 1 2 вся ветка
Текущий архив: 2004.01.13;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.011 c