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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2015, 22:43   #1
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию Удаление неполных дубликатов в StringGrid

Всем привет. Проблема следующая. Имеется большое количество строк в StringGrid, каждый раз разное, столбцов шесть. Нужно удалить строки с одинаковыми значениями первого столбца (нулевого), при этом оставив единственную строку из всех дубликатов только ту, у которой число в столбце 3 наименьшее.
Я реализовал это так:
Код:
 type
  THackGrid = class(TStringGrid);

  var
    i,y:Integer;
begin
  for i:=st.RowCount - 1 downto 0 do
    begin
      for y:=st.RowCount - 1 downto 0 do
        begin
          if i<>y then
            if Trim(st.Cells[0,i]) = Trim(st.Cells[0,y]) then
              if (Trim(st.Cells[3,i])<>'') and (Trim(st.Cells[3,y])<>'') then
                if StrToInt(Trim(st.Cells[3,i]))<StrToInt(Trim(st.Cells[3,y])) then
                  THackGrid(st).DeleteRow(y);
        end;
    end;
Код работает, но проблема в том, что это дичайше медленно, потому что подцикл каждый раз проходит все строки. При наличии ста тысяч строк обработка занимает порядка 4 часов. Возможно, кто-то уже сталкивался с подобной задачей и знает более быстродействующее решение. Либо можно это реализовать как-то иначе, чем у меня, но также с ощутимым приростом в быстродействии. Буду рад любой помощи с конкретными примерами, а не как обычно у нас тут любят писать "сделай через другой компонент, там сам придумаешь")
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 15.08.2015, 23:49   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
сделай через другой компонент
А как еще? Потому и медленно, что в визуальном компоненте. Начать с того - откуда данные там взялись. Если с СУБД, то там все на уровне sql сделать. В противном случае хотя бы в массиве структур это сделать и с сортировочкой для избежания лишних прогонов. Или в StringList это замутить. Милисекунды не будут, но и многие минут тоже
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 15.08.2015 в 23:51.
Аватар вне форума Ответить с цитированием
Старый 16.08.2015, 00:05   #3
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Код:
THackGrid(st).
Это что за финт?
Для начала (как уже верно заметили) это визуальный компонент. Так что проверьте:
Код:
begin
st.Visible:=False;
for ...
...
st.Visible:=True;
end;
что-то даст?
ResourceSpace вне форума Ответить с цитированием
Старый 16.08.2015, 10:41   #4
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Аватар, ResourceSpace, компонент ST создается динамически и невидимым. Данные берутся путем извлечения из файла собственного формата какой-то там программы, напоминающего чем-то csv-структуру. Порядок строк очень важен поэтому сортировкой тут пользоваться нельзя.

ResourceSpace, по поводу "THackGrid(st)." можно прочитать тут: http://www.programmersforum.ru/showp...47&postcount=2. Другими словами, он позволяет удалять строки из StringGrid без написания для этого специальной процедуры.
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 16.08.2015, 11:36   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А откуда в грид данные приходят?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.08.2015, 11:42   #6
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Stilet, я чуть выше писал, что извлекаются из файла. Файл мне присылают, он очень похож на csv по структуре.
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 16.08.2015, 13:04   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Невнимательно читал наверное...
Извлекай из файла в матрицу строк или записей и проводи все операции с ней. А уже потом грид из нее наполняй.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.08.2015, 14:34   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Сортировкой пользоваться можно, запомнив индекс в структуре, делай с массивом структур что хош, сортируй потом по этому индексу и обратно в соответствии с этим загружай куда хош
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.08.2015, 16:35   #9
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Аватар, так и сделал. С матрицей и обработкой в ней все работает в сотни раз быстрее.
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 16.08.2015, 16:45   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
С матрицей и обработкой в ней все работает в сотни раз быстрее.
Естесственно )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление дубликатов с ListBox celovec Общие вопросы Delphi 7 13.09.2016 09:07
Удаление дубликатов SolovejK Общие вопросы Delphi 7 13.03.2015 23:31
Удаление дубликатов Wind-up Bird Microsoft Office Excel 9 02.02.2012 12:49
Удаление дубликатов строк hon Паскаль, Turbo Pascal, PascalABC.NET 10 02.08.2011 05:29
Удаление дубликатов Deltist Microsoft Office Excel 11 14.01.2011 16:01