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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2011, 22:27   #11
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

JUDAS поставте точку останова на Result:=xList.Count-1; и посмотрите сколько раз туда будет вход
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
    xList: TStringList;
function uCount: Integer;
begin
  Result:=xList.Count-1;
end;
begin
  xList:=TStringList.Create;
  xList.Add('1');
  xList.Add('2');
  xList.Add('3');
  for i:=uCount downto 0 do
    if (xList.Strings[i]='2') or (xList.Strings[i]='1') then xList.Delete(i);
  xList.Free;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.09.2011, 22:48   #12
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
For лишь в начале вычисляются значения начала и конца
в таком случае уважаемый, после удаления десятка строк, ваш код падёт на значении i:=count-10 по причине того, что строки с номером count-10 уже не будет, (которую вы вычислили вначале)

--------
Цитата:
посмотрите сколько раз туда будет вход
посичтайте производительность в секундах моего кода и вашего, для количества строк более 10000
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 25.09.2011, 22:52   #13
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно удалить все, заменив
if (xList.Strings[i]='2') or (xList.Strings[i]='1') then xList.Delete(i);
на
xList.Delete(i);
и посмотреть где код упадет

add

Разница в 12 секунд не в пользу вашего алгоритма
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
    xList: TStringList;
begin
  xList:=TStringList.Create;
  for i:=1 to 200000 do xList.Add(IntToStr(i));
  Label1.Caption:=Format('Старт %s',[FormatDateTime('hh:nn:ss.zzz',Now)]);
  for i:=xList.Count-1 downto 0 do
    if Pos('3',xList.Strings[i])=0 then xList.Delete(i);
  Label2.Caption:=Format('Финиш %s',[FormatDateTime('hh:nn:ss.zzz',Now)]);
  xList.Free;
end;
Старт 22:15:01.979
Финиш 22:15:04.506

procedure TForm1.Button2Click(Sender: TObject);
var i: Integer;
    xList: TStringList;
begin
  xList:=TStringList.Create;
  for i:=1 to 200000 do xList.Add(IntToStr(i));
  i:=0;
  Label3.Caption:=Format('Старт %s',[FormatDateTime('hh:nn:ss.zzz',Now)]);
  while i<xList.Count do begin
    if Pos('3',xList.Strings[i])=0 then begin
      xList.Delete(i);
      continue;
    end;
    inc(i);
  end;
  Label4.Caption:=Format('Финиш %s',[FormatDateTime('hh:nn:ss.zzz',Now)]);
  xList.Free;
end;
Старт 22:15:45.627
Финиш 22:16:00.057
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 25.09.2011 в 23:21.
Аватар вне форума Ответить с цитированием
Старый 26.09.2011, 12:54   #14
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
да не вопрос откуда двигатся, вопрос про то, что при удалении элемента I счётчик в Вашем цикле, уменьшится на один и процедура c.Count будет пересчитіваться ровно столько раз сколко строк удаляется.
Если есть вопрос, то есть и ответ.
D? F1 for
Цитата:
For purposes of controlling execution of the loop, the expressions initialValue and finalValue are evaluated only once, before the loop begins. Hence the for...to statement is almost, but not quite, equivalent to this while construction:
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 20.10.2011, 00:03   #15
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Сорри, что поднял эту тему и что из-за моего вопроса столько шума было, просто delete я заменил на copy, тобиш чтоб не удалять в цикли лишнее, а просто нужное скопировать в стринг, а потом очистить tstringlist
Код:
for i:= a.Count - 1 downto 0 do
if Pos('текст', a[i])>0 then
try
b:='';
b:=a[i];
finally
FreeAndNil(a);
end;
На тот случай если кому понадобится
bulldog5293 вне форума Ответить с цитированием
Старый 20.10.2011, 00:30   #16
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
По умолчанию

Как говорил наш препод: "Сколько программистов столько и решений для одинаковой задачи"
Lime вне форума Ответить с цитированием
Старый 20.10.2011, 08:53   #17
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от bulldog5293
На тот случай если кому понадобится
Никому никогда категорически не рекомендую использовать это кошмарный ужас!!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.10.2011, 09:18   #18
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Цитата:
Никому никогда категорически не рекомендую использовать это кошмарный ужас!!!
Эт почему же7
bulldog5293 вне форума Ответить с цитированием
Старый 20.10.2011, 10:35   #19
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от bulldog5293 Посмотреть сообщение
Эт почему же7
Потому, что даже быдлокод слишком громкое название для приведенного вами фрагмента
1. И самое веселое - убиваете компонент и дальше в цикле с ним продолжается работа. Мало того что он убит - еще указателю на него nil присвоен.
2. К чему в этом контексте try...finally? Конечно можно догадаться к чему, но как он расставлен - это шедеврально
3. Перед присвоением в переменную строки очистка переменной - новый писк супер программирования
4. Команда Break наверно погулять пошла
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 20.10.2011 в 10:49.
Аватар вне форума Ответить с цитированием
Старый 20.10.2011, 10:43   #20
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Эт почему же7
1) зачем присваивать пустую строку а затем сразу же - значение?
Да ещё и в цикле?!!
это что - если по exception вылетает, что в строке был не мусор а пустая строка?! Так, хотя бы для цикла это надо делать.

2) зачем "ловить" чтение строки через Exception ?!

3) ну и главное, - это что, новое слово в технологии программирования - в цикле по свойствам объекта УНИЧТОЖАТЬ этот же объект, по которому идёт цикл?!

этот "экстрим" явно не для меня. Спаси и сохрани, как говорится.
И, соответственно, никому такое не посоветую!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск и удаление MISSING SilverSmallFish Microsoft Office Excel 4 28.06.2010 14:53
Поиск и удаление из TStrings Shouldercannon Общие вопросы Delphi 9 27.05.2010 19:47
Поиск и удаление битых путей Shouldercannon Общие вопросы Delphi 13 15.11.2009 17:37
поиск мин., удаление эл-ов массива Dmitrич Общие вопросы C/C++ 2 01.06.2009 13:31
Поиск и удаление столбцов mchip Microsoft Office Excel 4 17.05.2009 18:48