Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Вниз

Разбор строки по флагу   Найти похожие ветки 

 
Star   (2004-08-07 22:07) [0]

Дана строка вот такого содержания  "254356:23256:5346". Внимание, вопрос! Как разбить эту строку на три, чтобы каждая начиналась после двоеточия? Т.е.:
254356
23256
5346
Буду очень рад вашей помощи.


 
YurikGL ©   (2004-08-07 22:11) [1]

pos+f1
copy+f1
delete+f1

1) Ищем первое : если его нет то выход
2) Вытаскиваем строку перед ним
3) Удаляем подстроку до первого : и его тоже
4) Идти к п 1.


 
YurikGL ©   (2004-08-07 22:12) [2]

А еще можно в цикле посимвольно перебирать используя счетчик символов ":"


 
Fay ©   (2004-08-07 22:46) [3]


procedure YourCoolProc(var s1, s2, s3 : string);
var
 n1, n2 : Integer;
begin
 n1 := 1;
 while (n1 <= Length(s1)) and (s1[n1] <> ":") do Inc(n1);
 n2 := n1 + 1;
 while (n2 <= Length(s1)) and (s1[n2] <> ":") do Inc(n2);
 s3 := Copy(s1, n2 + 1, Length(s1) - n2);
 s2 := Copy(s1, n1 + 1, n2 - n1 - 1);
 SetLength(s1, n1 - 1);
end;

procedure TForm1.Button1Click(Sender : TObject);
var
 s1, s2, s3 : string;
begin
 s1 := "254356:23256:5346";
 YourCoolProc(s1, s2, s3);
 ShowMessage("1) " + s1 + #13#10"2) " + s2 + #13#10"3) " + s3);
end;


 
Star   (2004-08-07 22:56) [4]

> Fay ©   (07.08.04 22:46) [3]
И не влом тебе было сочинять веролосипед, тем более не универсальный. Мне достаточно было ответа YurikGL ©, я всё сразу понял и сделал.


 
Fay ©   (2004-08-07 23:06) [5]

Я редко отвечаю тем, кто не зарегистрирован на сайте. Видимо недостаточно редко.
>> тем более не универсальный.
ты читал свой вопрос?
>>  Мне достаточно было ответа YurikGL ©, я всё сразу понял и сделал.
Как правило, достатточно иметь мозги, а не понты.


 
wnew ©   (2004-08-07 23:18) [6]


> Star   (07.08.04 22:56) [4]

Да уж! Звезда, если ты такой крутой, какого ... задаёшь такие детские вопросы, и вместо благодарности палцы разводишь?


 
sniknik ©   (2004-08-07 23:25) [7]

> тем более не универсальный
универсальность и скорость не идут рука об руку. ;о) обычно. присмотрись внимательнее к примеру Fay ©   (07.08.04 22:46) [3] если она тебе нужна (скорость). и скажи спасибо за дополнительный вариант, вместо того чтобы огрызатся. кстати полностью отвечаююший на вопрос.

> я всё сразу понял и сделал.
сразу же надо было уведомить всех, а то не дай бог лишних знаний навяжут... и поблагодарить заодно YurikGL-а.
когда так говорят (что все понял), это означает что понял очень мало на самом деле. чем больше знаеш тем больше осознаеш как это мало...

p.s. свой вариант ебстественно ложить не буду, боюсь на грубость нарватся ;).


 
Fay ©   (2004-08-07 23:49) [8]

2 wnew ©   (07.08.04 23:18) [6]
2 sniknik ©   (07.08.04 23:25) [7]
Спасибо за поддержку 8).


 
Jolik ©   (2004-08-08 00:22) [9]

Я делаю так:


program Parser;

var
 S : string;
 StringList : TStringList;
 i : integer;

begin
 StringList := TStringList.Create();
// меняем все двоеточия на знак переноса строки
 S := StringReplace("254356:23256:5346", ":", ^M, [rfReplaceAll, rfIgnoreCase]);
// заливаем все это в стринглист
 StringList.SetText(PChar(S));
// здесь у нас уже три строки в стринглисте
 for i := 0 to StringList.Count-1 do
   S := StringList[i];
 StringList.Free;
end;


 
Riant   (2004-08-08 00:42) [10]

Нате, разбирайтесь...

var s, c: string;
begin

s:="254356:23256:5346";
repeat
c:=c+copy(s,1,pos(":",s)-1)+#13;
delete(s, 1, pos(":",s));
until s="";

end;


 
wnew ©   (2004-08-08 00:49) [11]

Ну и в чём разбираться?

s:="254356:23256:5346";
s := StringReplace("254356:23256:5346", ":",#13#10, [rfReplaceAll, rfIgnoreCase]);
Memo1.Lines.Add(s);


 
Fay ©   (2004-08-08 01:12) [12]

2 Riant   (08.08.04 00:42) [10]
Хуже придумать сложно. Это шутка такая? Тут (на форуме) принято ставить смайлики.
Если это не шутка, попробуйте покурить следующий текст :

var
 i : Integer;
 s : String;
begin
 s := "254356:23256:5346";
 for i := 1 to Length(s) do
   if s[i] = ":" then s[i] := #13;
 ShowMessage(s);
end;


 
YurikGL ©   (2004-08-08 09:19) [13]

var
i,k:longint;
s:string;
m1:array[1..3] of string;

begin
s:=edit1.text;
k:=1;
for i:=1 to length(s) do
 if s[i]<>":" then m1[k]:=m1[k]+s[i]
              else inc(k);


 
Думкин ©   (2004-08-08 09:32) [14]

>  [4] Star   (07.08.04 22:56)

В форуме игры тоже один пальцы гнет - все знает, но вот решить нифига не может.

По сабжу.
TStrings, Delimiter.


 
Fay ©   (2004-08-08 09:33) [15]

2 Riant   (08.08.04 00:42) [10]
Извините меня, пожалуйста! Хуже придумали. См. [13]


 
Думкин ©   (2004-08-08 09:35) [16]

Безусловно, если только поразумеваются строки такого типа. В случаке 3-х конечно городить не надо, а использовать описанное выше.


 
diaz   (2004-08-08 09:52) [17]

Счетаю, что YurikGL [13] наиволее соответствует поставленной задаче и быстрее.


 
Думкин ©   (2004-08-08 09:57) [18]

> [17] diaz   (08.08.04 09:52)

Абсолютно неверное утверждение.
Кстати, домашнее задание - почему [3] оптимальнее?


 
DRON   (2004-08-08 16:38) [19]

Ну и ещё один вариант до кучи :) (улучшение [13]):

var
 Source:string;
 Dest:array[0..2] of string;
 PC,First:PChar;
 A:Integer;
begin
 PC:=PChar(Source);
 if Source<>"" then
   for A:=Low(Dest)to High(Dest) do begin
     First:=PC;
     while not(PC^in [":",#0]) do
       Inc(PC);
     SetString(Dest[A],PC,PC-First);
     if PC^=":" then Inc(PC);
   end;
end;


 
diaz   (2004-08-08 18:47) [20]

-> Думкин [18] потому, что все сработано в одном цикле, меньше переменных и меньше времени потрачено на обращение с системным функциям типа inc(), Low(), SetString() и т.д.


 
diaz   (2004-08-08 18:49) [21]

diaz [20] - это я в защиту YurikGL [13]


 
DRON   (2004-08-09 02:02) [22]

to: diaz   (08.08.04 18:47) [20]
число переменных скорость не уменьшает (наоборот можно заранее что-то вычислить и брать затем из переменной), inc не функция - компилятор ставит просто инструкцию inc; low - в большинстве случаев известен на этапе компиляции (то есть это просто константа); SetString - самый быстрый способ получения строки в Delphi-йском формате (работа с самим PChar конечно быстрее из за отсутствия подсчёта ссылок), а вот в цикле из [13] чёрт знает сколько раз вызывается @LStrFromChar, а ещё @LStrCat которая на каждый символ исходной строки дёргает менеджер памяти, что вообще ни в какие ворота не лезет. Нажми Ctrl+Alt+C и посмотри во что превращается с виду безобидная " m1[k]:=m1[k]+s[i] ", даже SetLength(m1[k],Length(m1[k])+1);m1[k][Length(m1[k])]:=s[i] и то быстрее выполняется потому что у компилятора нет специальной функции для добавления символа к строке, он переводит один символ в строку (выделяя для него место на куче!), а потом использует универсальную функцию для сложения строк (которая не оптимизированна под добавление одного символа).


 
Думкин ©   (2004-08-09 06:29) [23]

> [22] DRON   (09.08.04 02:02)

Угу.
> [21] diaz   (08.08.04 18:49)

Покури такое:
const Max = 10000000;

procedure TfMain.Button1Click(Sender: TObject);
var s : string;
    i : integer;
    a : Cardinal;
begin
    s := "";
    a := GetTickCount;
    Screen.Cursor := crHourGlass;
    try
     for i := 1 to Max do s := s + chr(random(27)+65);
     Button1.Caption := Format("%d ms",[GetTickCount - a])
    finally
     Screen.Cursor := crDefault
    end
end;

procedure TfMain.Button2Click(Sender: TObject);
var s : string;
    i : integer;
    a : Cardinal;
begin
    SetLength(s, Max);
    a := GetTickCount;
    Screen.Cursor := crHourGlass;
    try
     for i := 1 to Max do s[i] := chr(random(27)+65);
     Button2.Caption := Format("%d ms",[GetTickCount - a])
    finally
     Screen.Cursor := crDefault
    end
end;


 
Fay ©   (2004-08-09 06:49) [24]

2 Думкин ©   (09.08.04 06:29) [23]
Результаты будут намного интереснее, если не вычислять символ, а колотить константу.


 
diaz   (2004-08-09 07:11) [25]

-> Думкин [23] второй в 40 раз быстрее !


 
Fay ©   (2004-08-09 07:16) [26]

2 diaz   (09.08.04 07:11) [25]
У тебя какой проц?


 
Думкин ©   (2004-08-09 07:17) [27]

>  [24] Fay ©   (09.08.04 06:49)

Ага. :)


 
diaz   (2004-08-09 10:55) [28]

-> Fay [26] celeron-500


 
Fay ©   (2004-08-09 12:07) [29]

У меня C2400/865. Разница в 30 раз.


 
DRON   (2004-08-09 16:09) [30]

Так
PChar(s)[i-1]:=chr(random(27)+65);
ещё чуть чуть быстрее так как не вызывается @UniqueString.
to Fay & Diaz:
Разница в скорости тут, по большей части, зависит не от гигагерц, а от скорости памяти и размера кэша (у вас строка 10 метров).
А Button1Click, по большому счёту, проверяет скорость работы менеджера памяти, при его замене цифры совсем другие получаются.


 
Sectey ©   (2004-08-09 16:36) [31]

А мне кажется вы опять начинаете изобретать велосипед :-) Есть библиотека QStrings там работа со string на все случае жизни :-)


 
Fay ©   (2004-08-09 17:53) [32]

2 Sectey ©   (09.08.04 16:36) [31]
Сходите в торгующий велосипедами магазин (побольше). Посмотрите - все велосипеды одинаковые?
Боюсь даже предположить, что я не могу сделать сам такого, что так здорово умеет (предположительно) QStrings.


 
Fay ©   (2004-08-09 17:56) [33]

2 DRON   (09.08.04 16:09) [30]
Я, на самом деле, ожидал ответа типа "у меня Athlon такой-то".
Про остальное - в курсе 8)


 
DRON   (2004-08-09 18:00) [34]

Sectey ©   (09.08.04 16:36) [31]:
Мы не изобретаем велосипеды, а делаем их. Это называется программированием и за это деньги платят. По поводу QStrings: практически все функции из неё есть в 7-ой версии (Masks,StrUtils итд), возможно они выполняются чуть быстрее, но я не думаю, что автор делал такое же тестирование как в Borlande, да и VCL их не будет использовать.
Для решения первоначальной задачи можно использовать Q_StrTok но она (в общем случае) не будет быстрее [19], так как изменяет исходную строку (лишнее действие). Кстати, исходник Q_StrTok очень похож на мой вариант :)
To Fay ©   (09.08.04 17:53) [32]:
Там (в QStrings) просто используются всякие аналоги Move и Compare оптимизированные под современные процы и набор функций активно эти аналоги использующий.


 
DRON   (2004-08-09 18:03) [35]

Fay ©   (09.08.04 17:56) [33]:
AthlonXP 2000+ разница в 30 раз (4500 и 150)


 
Fay ©   (2004-08-09 18:19) [36]

2 DRON   (09.08.04 18:03) [35]
>> AthlonXP 2000+ разница в 30 раз (4500 и 150)
Это очень долго. Страно.


 
DRON   (2004-08-09 18:39) [37]

Fay ©   (09.08.04 18:19) [36]
А у тебя какие цифры? У тебя Max=10^7 ?


 
Fay ©   (2004-08-09 18:46) [38]

1) 1234 8)
2) 64

... Это без Random


 
Fay ©   (2004-08-09 18:48) [39]

Это на работе. Проц такой же.


 
DRON   (2004-08-09 20:19) [40]

А у меня с Random было.
Без него 980 и 80.



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.037 c
14-1091791513
Юрий Зотов
2004-08-06 15:25
2004.08.22
Переустановка Red Hat "по месту" - это возможно?


14-1091757883
Думкин
2004-08-06 06:04
2004.08.22
С днем рождения! 6 августа


9-1084098338
jet_set
2004-05-09 14:25
2004.08.22
игра построенная с помощью массивов.


1-1091688539
MadGhost
2004-08-05 10:48
2004.08.22
как добавить значение к переменной окружения PATH ??


3-1090902152
Jiny
2004-07-27 08:22
2004.08.22
Как перерисовать значение по формуле из табл. в DBgrid ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский