![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Слияние двух стринглистов [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, то пишем в результирующий список только пару данных из второго стринглиста. Далее результирующий стринглист сравниваем со вторым и если совпадений нет с элементом второго, то записываем его в результирующий, иначе пропускаем. Можно еще при совпадениях и после записи в результирующий список на первом этапе делать эти элементы пустыми в обоих списках, тогда можно будет пропускать пустые элементы на втором этапе.