Форум: "Основная";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];
ВнизУдаление пробела из строки Найти похожие ветки
← →
smolin (2004-02-18 14:21) [0]Подскажите пожалуста какой функцией надо воспользоваться чтобы удалить пробелы из строки.
Например есть строка "aaa bbb ccc", а надо получить "aaabbbccc"
← →
MBo (2004-02-18 14:24) [1]одной строчкой, но медленно - StringReplace
четыре-пять строчек - цикл for со сдвигом очередного символа на количество найденных пробелов.
← →
Amoeba (2004-02-18 14:30) [2]Можно использовать готовую оптимизированную ф-ию из бесплатной отечественной библиотеки QStrings
{ Q_DeleteText удаляет из строки S все вхождения подстроки SubStrToDel. Поиск
подстроки ведется без учета регистра символов. Функция возвращает количество
найденных (и удаленных) фрагментов. }
function Q_DeleteText(var S: string; const SubStrToDel: string): Integer;
← →
ALEIIIKA (2004-02-18 14:36) [3]Удаляет все пробелы в строке S
while Pos(s," ") > 0 do
Delete(s,Pos(s," "),1);
← →
Radionov Alexey (2004-02-18 14:54) [4]>MBo © (18.02.04 14:24)
де жа вю [3]? :))
← →
Loneron (2004-02-18 15:01) [5]Поддерживаю ALEIIIKA © (18.02.04 14:36)
Только незачем Pos 2 раза вызывать
← →
Radionov Alexey (2004-02-18 15:07) [6]>Loneron © (18.02.04 15:01) [5]
Позвольте узнать почему поддерживаете?
← →
Loneron (2004-02-18 15:11) [7]>Radionov Alexey © (18.02.04 15:07)
поддерживаю, потому что сам бы написал этом духе. Позвольте узнать, а вам чем не нравится?
← →
Radionov Alexey (2004-02-18 15:17) [8]>Loneron © (18.02.04 15:11) [7]
Просто потому, что время работы при такой реализации будет пропорционально квадрату длины строки.
(Pos каждый раз начинает просмотр с начала строки - получаем неявный вложенный цикл, когда достаточно одного всего цикла)
← →
Loneron (2004-02-18 15:23) [9]
for i := Length(S) - 1 downto 0 do
if S[i] = " " then Delete(S, i, 1);
на этом закончим? :)
← →
Radionov Alexey (2004-02-18 15:24) [10]>Loneron © (18.02.04 15:23) [9]
Не-а :)))
Все равно есть квадратичная зависимость (Delete вызывает ее)
;-)
← →
Loneron (2004-02-18 15:29) [11]Ладно, уговорил
Buf := "";
for i := 0 to Length(S) - 1 do
if S[i] <> " " then Buf := Buf + S[i];
S := Buf;
ну так то хоть пойдет? :)
← →
Radionov Alexey (2004-02-18 15:34) [12]>Loneron © (18.02.04 15:29) [11]
Конкатенация строк - думаешь, легче будет?
Я в таких случаях завожу два индекса (вернее, две индексных переменных) для одной строки. Один для чтения, другой для записи. Первый за каждый шаг увеличивается на 1. Второй увеличивается, если только попадается "правильный" символ. Таким образом все творится пределах одной строки и за один проход. В конце только нужно подкорректировать длину строки по второму индексу.
← →
ALEIIIKA (2004-02-18 15:35) [13]Главно довести идею, оптимизация потом пойдет исходя из найденного текущего решения. Я и не говорил, что это оптимальный вариант.
← →
Loneron (2004-02-18 15:46) [14]>Radionov Alexey © (18.02.04 15:34)
Вах, шайтан! :))
← →
Fay (2004-02-18 15:54) [15]2Loneron © (18.02.04 15:46) [14]
попробуйте проделать это со строкой длиной 100000.
← →
Amoeba (2004-02-18 15:57) [16]
> со строкой длиной 100000
Не дай Бог, чтобы такая строка ночью приснилась...
← →
Romkin (2004-02-18 16:06) [17]Так пойдет?
function DeleteAllChars(const S: string; CharToDelete: char): string;
var
i, len: integer;
begin
SetLength(Result, length(S));
len := 0;
for i := 1 to length(S) do
if S[i] <> CharToDelete then
begin
inc(len);
Result[len] := S[i];
end;
SetLength(Result, len);
end;
← →
dr Tr0jan (2004-02-19 10:16) [18]Смотри http://delphimaster.net/view/1-1077158471/
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.007 c