Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Слияние двух стринглистов [D5]


harisma ©   (2011-03-10 17:40:00) 

Есть 2 стринглиста. В каждом из них есть некоторое количество строк.
Каждая строка имеет следующий вид:

<идентификатор из 16 символов>|F<число>

В пределах каждого из стринглистов <идентификатор из 16 символов> есть величина уникальная.

Задача: Объединить эти два стринглиста в один, причем если в первом стринглисте была запись с <идентификатор из 16 символов>, которая есть также и во втором стринглисте, но с другим значением F<число>, то в результирующий стринглист должна попасть запись, взятая из второго стринглиста.
Как это сделать, чтобы код быстро работал?


sniknik   (2011-03-11 10:21:00) [1]

> Заменить на <идентификатор из 16 символов>=<число>.
проще NameValueSeparator:= '|';

> От автора темы потребуется ...
от автора требуется сделать хоть что нибудь... и после, если будет долго, показать здесь чтобы мы посмеялись над теми ляпами которыми он умудрился этого добиться.


Сергей М.   (2011-03-11 10:19:00) [2]

Да, ну и самое важное упустил : ResultList есть наследник TStringList с перекрытым методом CompareStrings


Сергей М.   (2011-03-11 10:13:00) [3]

ResultList.Assign(List2);
ResultSL.Sort;
ResultSL.Duplicates := dupIgnore;
ResultSL.AddStrings(List1);


Стенка   (2011-03-11 09:09:00) [4]

> han_malign   (11.03.11 08:48) [11]

От автора темы потребуется небольшая переработка алгоритма слияния,
поэтому и было использовано словосочетание "алгоритм, похожий на слияние"


han_malign   (2011-03-11 08:48:00) [5]


> алгоритмом, похожим на слияние

- прямо так и называется:
http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC


Стенка   (2011-03-10 20:06:00) [6]

Выставить сортед=тру в обоих списках,
затем пройтись по ним алгоритмом,
похожим на слияние.


KilkennyCat   (2011-03-10 19:50:00) [7]


> Германн ©   (10.03.11 18:54) [5]
> Юрий   (10.03.11 18:57) [7]

о фигне спорите. тупое сравнение строковых идентификаторов равносильно сравнению чисел.


sniknik   (2011-03-10 19:38:00) [8]

> не превысит 2000 элементов.
ну так, а чего париться то? фигня а не количество.
только специально вставленные задержки, либо нарочно кривая работа, хоть как то отразится на скорости...


_Юрий   (2011-03-10 18:57:00) [9]


> Германн ©   (10.03.11 18:54) [5]


IndexOfName не будет использовать сортированность, а будет перебирать подряд. По скорости может быть критично.


_Юрий   (2011-03-10 18:55:00) [10]

а если порядок следования строк в листе не важен, то просто отсортировать первый список, и использовать Find


Германн   (2011-03-10 18:54:00) [11]


> <идентификатор из 16 символов>|F<число>
>

Заменить на <идентификатор из 16 символов> =<число>. И для поиска использовать IndexOfName.


_Юрий   (2011-03-10 18:50:00) [12]


> Как это сделать, чтобы код быстро работал?


Заводим третий стринг лист. Сортед выставляем в тру.
В строках - <идентификатор из 16 символов>, в обжектсах - индекс строки в первом стринг-листе.
Сначала проходим по первому стринглисту, заполняем третий
потом проходим по второму, для поиска соответствия используем третий.


harisma   (2011-03-10 18:14:00) [13]

Ну, количество записей в соединяемых стринглистах при всем желании в том месте, где это должно использоваться, не превысит 2000 элементов.


sniknik   (2011-03-10 17:53:00) [14]

с "некоторым количеством строк" что угодно будет работать быстро (если специально задержек не ставить), т.е. это еще умудриться нужно...
а вот с "каким то количеством"... тут база нужна, и ни в коем случае не стринглист.


Conflict   (2011-03-10 17:50:00) [15]

Берется эти 2 стринглиста. сравниваются каждый элемент первого с каждым элементом второго в цикле. Если не находим совпадений по Name- пишем в третий стринглист пару данных из первого. Если находим совпадения по Name, то пишем в результирующий список только пару данных из второго стринглиста. Далее результирующий стринглист сравниваем со вторым и если совпадений нет с элементом второго, то записываем его в результирующий, иначе пропускаем. Можно еще при совпадениях и после записи в результирующий список на первом этапе делать эти элементы пустыми в обоих списках, тогда можно будет пропускать пустые элементы на втором этапе.


Наверх

Титульная страница Поиск, карта сайта Написать письмо