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

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

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

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

Ответить   Tue, 18 Dec 2007 23:24:07 +0500 (#711843)

 

Ответы:

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

Ответить   Wed, 19 Dec 2007 09:52:01 +0300 (#711939)

 

Hello, deonis_fon!

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

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

Ответить   "Vladimir V.Petrov" Wed, 19 Dec 2007 09:19:23 +0200 (#711947)

 

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

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

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

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

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

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

Ответить   Andrey Yakushev Wed, 19 Dec 2007 12:13:07 +0300 (#712046)

 

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

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

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

Ответить   Wed, 19 Dec 2007 23:39:09 +0500 (#712069)