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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2013, 21:12   #1
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию Удаление одинаковых строк из массива

Здравствуйте, уже дня два бьюсь над алгоритмом удаления одинаковых строк из динамического массива строк, вот все мои старания, помогите, пожалуйста довести до ума
Код:
procedure TForm1.Button1Click(Sender: TObject);
var a:array of string;
    b:array of string;
    i,j:integer;
    counts:integer;
begin
  j:=0;
  counts:=memo1.lines.count;
  setlength(a,counts);
    setlength(b,counts);
  for i:=0 to counts-1 do a[i]:=memo1.lines[i];
  memo1.Clear;
  for i:=0 to counts-1 do
  begin
  if a[i]<>a[i+1] then b[i]:=a[i];
  inc(j);
  end;
  for i:=0 to j do memo1.lines.Add(b[i]);
  a:=nil;
  b:=nil;
end;
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 12.05.2013, 21:22   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
var
  ts: tstringlist;
begin
  ts := tstringlist.Create;
  ts.Sorted := true;
  ts.Duplicates := dupIgnore;
  ts.Text := Memo1.Text;
  Memo1.Text := ts.Text;
  ts.Free;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 12.05.2013, 21:36   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
with TStringList.Create do begin
 Duplicates:=dupIgnore;
 for i:=0 to memo1.lines.counts-1 do Append(memo1.lines[i]);
 // теперь в списке нет дубликатов
 for i:=0 to Count-1 do
  что-то делаем с элементами посредством Strings[i]
 free;
end;
Идея ясна?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.05.2013, 22:49   #4
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

не ясна, мемо для наглядности, а так удаляем строки из уже созданного и заполненного стринг листа
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 12.05.2013, 23:01   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Если ts - исходный stringlist, то:
Код:
with TStringList.Create do begin
  Sorted := true;
  Duplicates := dupIgnore;
  Text := ts.Text;
  ts.Text := Text;
  free;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 13.05.2013, 01:24   #6
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

а как это работает? Зачем там сортировка? А зачем free в обработчике писать? Можно же в событиях формы это сделать

Ладно, пока не разобрался в Вашем алгоритме, но суть в том что работает, вот то, что получилось
Код:
procedure TForm1.N3Click(Sender: TObject);
var
  isa:integer;
begin
with TStringList.Create do
 begin
  Sorted := true;
  Duplicates := dupIgnore;
  Text := sl.Text;
  sl.Text := Text;
  free;
 end;
 listbox1.Clear;
 for isa:=0 to sl.Count-1 do
 listbox1.Items.insert(isa,extractfilename(sl.Strings[isa]));
 showmessage('Повторяющиеся треки были успешно удалены!');
end;
И все же если можно объясните как это работает?

Да, и еще, у меня есть процедура сортировки, описаная в procedure TForm1.N10Click(Sender: TObject); как мне ее вызвать в процедуре удаления?
from dark to light)

Последний раз редактировалось Stilet; 13.05.2013 в 09:32.
Алексей_2012 вне форума Ответить с цитированием
Старый 13.05.2013, 09:04   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Алексей, на будущее, если Вы обрабатываете список и в процессе обработки количество записей уменьшается (а именно так и происходит в случае удаления строк), то обрабатывать записи нужно либо в циклах While \ repeat until
либо в цикле for, но от последней записи к первой:
Код:
for i:=Список.Count-1 downto 0 do
  if условие_удаления then УдалитьИзСписка_i-й_элемент
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.05.2013, 09:37   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Зачем там сортировка?
Вообще для удаления дубликатов она нужна, хотя кажись в данном случае без нее можно (не уверен). Нужно в хелпе почитать обязательна ли она или нет. Возможно дубликаты ищутся бинарным поиском, а без сортировки он не работает.
Цитата:
А зачем free в обработчике писать?
4
Чтоб память не потерять. with дает анонимную переменную. Как ты ее потом будешь освобождать? По какому имени?.

Цитата:
объясните как это работает?
Код:
// Создаем временную анонимную переменку
with TStringList.Create do
 begin
// Устанавливаем для нее сортировку и игнор при попытке добавить элемент, который уже есть
  Sorted := true;
  Duplicates := dupIgnore;
//Добавляем весь текст. При этом должна (не уверен) происходить проверка каждого на задвоенность.
  Text := sl.Text;
//Возвращаем назад но уже без дубликатов
  sl.Text := Text;
//Убираем анонимную переменную.
  free;
 end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.05.2013, 23:16   #9
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Большое спасибо за описание, но все же

Цитата:
Да, и еще, у меня есть процедура сортировки, описаная в procedure TForm1.N10Click(Sender: TObject); как мне ее вызвать в процедуре удаления?
Сортировка по не возрастанию; или придется создавать процедуру, вырезать в нее из Н10 клик и потом писать имя процедуры созданной в н10 клик и в процедуре удаления дублей?

А на будущее, как удалять дубликаты из массива? Заполнить стринглист и по такому же алгоритму? Ну на делфи так можно, а на паскале вить нет, или я не прав?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 14.05.2013, 08:29   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как удалять дубликаты из массива?
1) Надо просто их в массиве не допускать
2) Переписывать в новый массив.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление одинаковых строк на листе Excel 2003 vfv Microsoft Office Excel 26 21.11.2014 12:58
удаление строк массива XaHTeP Паскаль, Turbo Pascal, PascalABC.NET 8 12.01.2013 20:23
Поиск одинаковых строк и изменения и удаление NightDevil Microsoft Office Excel 8 14.04.2012 01:45
Удаление одинаковых символов из массива maxflint Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 09.05.2010 13:18
удаление одинаковых элементов из массива sauron99 Общие вопросы Delphi 6 15.04.2009 21:27