Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2011, 12:31   #1
rager06
Пользователь
 
Регистрация: 08.09.2010
Сообщений: 17
По умолчанию Удалить n слов из строки

Здравствуйте! Подскажите, пожалуйста по такому вопросу, есть Edit в котором слова. Слова эти разделены пробелами. Как удалить n первых слов из строки, если n мы задаем в коде?!
rager06 вне форума Ответить с цитированием
Старый 20.06.2011, 12:46   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Берешь строку и проверяешь каждый символ в цикле - соответственно каждый пробел завершает одно слово. Нужно насчитать n пробелов. Соответственно позиция последнего (n-го) пробела в строке будет указывать на то число символов, которые необходимо удалить.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 20.06.2011, 20:28   #3
JetUS
Пользователь
 
Аватар для JetUS
 
Регистрация: 23.09.2009
Сообщений: 27
По умолчанию

Код:
N := 5;
i := 1;
S := Memo1.Text;
p := Pos(' ', S);
while (p > 0) and (i <= N) do
begin
  S := Copy(S, p+1, MaxInt);
  p := Pos(' ', S);
end;
Что-то в таком духе.
JetUS вне форума Ответить с цитированием
Старый 21.06.2011, 07:08   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Во время каждого прохода ты копируешь строку, а это кажись не просто перенос символов, а создание строки заново. В общем быстрей должно быть именно нахождение указателя и только уже затем манипуляция (одна единственная, вместо твоих 5 в крайнем случае) со строкой...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 21.06.2011, 08:45   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от JetUS
Код:
while (p > 0) and (i <= N) do
begin
  S := Copy(S, p+1, MaxInt);
  p := Pos(' ', S);
end;
Что-то в таком духе.
а где наращиваение I в цикле?! данный код будет перебирать строку, пока пробелы не кончатся...



Цитата:
В общем быстрей должно быть именно нахождение указателя и только уже затем манипуляция
на мой взгляд - некритично. Ну, безусловно, предложенный Вами способ с поиском N-го пробела лучше!
Но, я уверен (если хотите, могу проверить), что при любом N < 10000, предложенный выше код (точнее, аналогичный, только правильный!) на любой машине, поддерживающей Windows будет выполняться сотые (если не тысячные) доли секунды.

Не, ну понятно, конечно, что программа, работающая 10 миллисекунд лучше, чем программа, работающая целых 50 миллисекунд. Но не думаю, чтобы в данном случае это имело хоть какое-то мало-мальски важное значение...

Последний раз редактировалось Serge_Bliznykov; 21.06.2011 в 08:48.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.06.2011, 09:48   #6
JetUS
Пользователь
 
Аватар для JetUS
 
Регистрация: 23.09.2009
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а где наращиваение I в цикле?! данный код будет перебирать строку, пока пробелы не кончатся...
Сорри, писал прямо в браузере и завтыкал. Пытался передать общий смысл.

Цитата:
Сообщение от Utkin Посмотреть сообщение
Во время каждого прохода ты копируешь строку, а это кажись не просто перенос символов, а создание строки заново. В общем быстрей должно быть именно нахождение указателя и только уже затем манипуляция (одна единственная, вместо твоих 5 в крайнем случае) со строкой...
Я так понимаю, что вопрос задал новичок.
Может ему ещё показать, как это реализовать мультипоточно?
JetUS вне форума Ответить с цитированием
Старый 21.06.2011, 10:22   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Я так понимаю, что вопрос задал новичок.
Может ему ещё показать, как это реализовать мультипоточно?
ну, спокойней, спокойней, не горячитесь...

Utkin имел в виду другое. Что алгоритм не эффективен. И что для решения этой задачи не надо в цикле удалять из строки подстроку - это просто нерентабельно. А лучше идти по строке, считать встречающиеся пробелы, отсчитали N - удалить ЦЕЛИКОМ все слова.
примерно так:
Код:
i := 1;
S := Trim(Memo1.Text);
K:=0; {счётчик найденных ВАЖНЫХ пробелов}
for i:=1 to Length(S)-1 do begin
   if (s[i]=' ') and (s[i+1]<>' ') then begin Inc(K); p:= i; end;
   if K=N then Break; {выход из цикла, если дошли до нужной позиции}
end;
if K<N then begin S:=''; ShowMessage('В строке нет N слов - поэтому удалили всё строку!') end
else Delete(S,1, p);

Memo1.Text := S;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.06.2011, 13:37   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Не, ну понятно, конечно, что программа, работающая 10 миллисекунд лучше, чем программа, работающая целых 50 миллисекунд. Но не думаю, чтобы в данном случае это имело хоть какое-то мало-мальски важное значение...
Ещё какое ! Самое что ни на есть важное. Вот так вот люди и приучаются думать - а, пойдет. Подумаешь миллисекунда там, миллисекунда сям. А потом в большом проекте набегают секунды и минуты . И самое главное человек привыкает так мыслить - что достаточно самого первого решения, которое придет в голову... А я потом горько жалел, что не научился оптимизировать свой код...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 21.06.2011 в 13:43.
Utkin вне форума Ответить с цитированием
Старый 21.06.2011, 14:23   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Utkin, ну, Вы же понимаете, что Вы немного утрируете?!
в реальной жизни всё далеко не так однозначно...

Хорошо. давайте рассмотрим такой простой пример.
Есть фунция PosEx
решение задачи через неё:
Код:
uses .... StrUtils;

...

procedure TForm1.Button1Click(Sender: TObject);
const N = 4;
var s : string;
   i, p : integer;
begin
  s := Edit1.Text;
  p := 0;
  i := 0;
  repeat
    p := PosEx(' ', s, p+1);
    if p>0 then inc(i);
  until ((p=0) or (i=N));
  if (p=0) then ShowMessage('Не нашли')
  else Edit2.Text := Copy(s, p+1, Length(s)-p);
end;
есть решение через поиск пробела (смотри мой пост выше)
есть решение через удаление подстроки (пост #3)

Вы готовы ДОКАЗАТЬ, насколько эти варианты отличаются по быстродействию?! Дайте, приведите конкретные цифры?

p.s. А ещё не забывайте, есть такие языки как JAVA, C# (и другие под .NET) - там подобную задачу можно решить вообще одним оператором.
Ну и что, что выполняться будет на пять миллисекунд дольше.
Если в 99.9% случаев (когда данный код не вызывается в миллионных циклах) разницу НЕВОЗМОЖНО уловить!! Никак! Погрешность загруженности Windows больше может влиять на скорость выполнения, чем методы оптимизации..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.06.2011, 14:29   #10
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Конечно, понимаю (что утрирую) . Я хотел сказать, что самое первое решение не самое лучше. Потому что решающий будет его распространять не только на операторы с миллисекундной разницой, но и на функции (как правило самописные) с большими задержками .

Цитата:
Вы готовы ДОКАЗАТЬ, насколько эти варианты отличаются по быстродействию?!
А легко - Виста и 7-ка. Конечно пишут и не на Дельфи, но суть от этого не меняется. Опять же патчи, фиксы и бесконечные обновления приводящие к выпуску новой версии операционки.

Цитата:
Погрешность загруженности Windows больше может влиять на скорость выполнения, чем методы оптимизации..
Вот тут я бы хотел отметить - я не оптимизировал, а пытался изначально составить быстрый (ну естественно все относительно) алгоритм.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 21.06.2011 в 14:35.
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить текст между двух слов Polotenchik Microsoft Office Word 5 12.06.2011 11:01
Даны строки S и S0. Удалить из строки S все подстроки, совпадающие с S0 . Если совпадающих подстрок нет, Шпунюся Помощь студентам 1 16.12.2010 21:02
Удаление слов из строки. grave123 Общие вопросы C/C++ 2 20.12.2009 15:01
С++ строки(замена слов) GodsamcK Помощь студентам 0 15.12.2009 19:02
Как из переменной типа String удалить пару слов zotox Помощь студентам 3 30.11.2008 19:14