Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

За 2007-12-19

Re: Сравнить два списка

Здарова, deonis_fon!!!

Отвечаю на письмо от Tuesday, December 18, 2007, 11:24:07 PM
по теме Сравнить два списка

надо сортировать - иначе не ускоришь поиск.
а в сортированом поиск ускоряется в мегаразы - чем больше файлы, тем
заметнее.
и почему ты считаешь, что потом потеряется возможность вернуться к
первоначальному варианту? создаёшь класс, в котором хранится сама
строка и её порядковый номер в файле (и кстати, флаг удалённости).
загружаешь файлы в два массива из экземпляров этого класса. сортируешь
их по содержимому строки, сравниваешь, делаешь что там нужно, потом
сортируешь обратно по порядковому номеру и сохраняешь.

   2007-12-19 21:48:32 (#712069)

Re: Сравнить два списка

Здравствуйте, deonis_fon.

Действительно, самый простой способ - срАвнить файлы построчно. Но это
порождает двойной цикл. Есть способ избавиться от этого.

Открываете файл А.
Вписываете в начало каждой строки её порядковый номер.
Затем делаете цикл (единственный) по строкам из файла Б, в котором
проверяете. В этом цикле проверяете функцией Pos наличие строки из
файла в свойстве Text, в котором хрАнится всё содержимое файла А в
виде одной строки. Найдя позицию, Вы выбираете все предыдущие символы
из этой строки до символа перевода строки, таким образом получив номер
совпадающей строки, которую можете удалить.

Но надо ставить эксперимент, чтобы выяснить, действительно ли этот
способ лучше.

А на последок я Вам скажу: Ваш ник пишется через букву "И", а не "Е".
Удачи в изучении русского языка!

Вы писали 18 декабря 2007 г., 21:24:07:

> Оболчка Делпфи
> Всем привет, есть два списка TStringList (на пример), они не
> сортированые и их не надо сортировать .. надо их сровнить на предмет
> совпадающих строк и в том и в другом списке ... способ сравнивания
> одной строки из одного списка со всеми (по очереди) строками из другово
> списка я знаю ... есть ди другой более быстрый способ сравнения.
> Прще говоря есть два текстовых файла, файл А, и файл Б, в котором
> хронятся часть строк из файла А, которых надо убрать из файла А.
> Сортировать нельзя, ибо мне потом надо сохранить файл А в исходном
> структурном виде, но уже с удаленными строками ...
> Спасибо за ответ.
> --
> А на последок я вам скажу: В самой красивой и ангельской женщине всегда запрятана
> большая обезьяна
> С Уважением Деонис (Из города святой Екатерины с горячим приветом)

   Andrey Yakushev 2007-12-19 18:58:16 (#712046)

Re: Сравнить два списка

Hello, deonis_fon!

df> Прще говоря есть два текстовых файла, файл А, и файл Б, в котором
df> хронятся часть строк из файла А, которых надо убрать из файла А.
df> Сортировать нельзя, ибо мне потом надо сохранить файл А в исходном
df> структурном виде, но уже с удаленными строками ...
df> Спасибо за ответ.

Если размеры файлов не слишком большие.
Создаете структуру где содержится позиция строки, сама строка и признак на
удаление. Грузите файл А в вектор структур.
Читаете файл Б построчно и ищете строки в векторе. Ставите признак удаления
если строка найдена. Выгружаете вектор в файл без удаленных.
Это базовый. Можно модифицировать. Например выгружать А не в вектор а в
мэпу, тогда поиск будет осуществляться быстрее. Но тут сложность, что
порядок записей в мэпе нарушается. Т.е. нужен механизм или сортировки по
позициям или создавать еще одну мэпу, где ключем является позиция, связаную
с первой через ссылки на структуры.

Если файлы слишком большие, то это естественно не подходит.

   "Vladimir V.Petrov" 2007-12-19 10:22:07 (#711947)

Re: Сравнить два списка

> deonis_fon пишет:
> Сортировать нельзя, ибо мне потом надо сохранить файл А в исходном
> структурном виде, но уже с удаленными строками ...
> Спасибо за ответ.

Не вижу ничего лучше, как для каждой новой строки из одного списка
пробегать ВСЕ строки во втором - ЭТО ВЫ ЗНАЕТЕ
В базе данных можно было бы построить индексный файл. Суть его в том,
что в каждой строке хранится номер, под которым эта строка БЫЛА БЫ в
отсортированном списке - ЭТО ВТОРОЙ ВАРИАНТ
С уважением, Борис

   2007-12-19 09:46:52 (#711939)