Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.06.19;
Скачать: CL | DM;

Вниз

Слияние двух стринглистов   Найти похожие ветки 

 
harisma ©   (2011-03-10 17:40) [0]

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

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

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

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


 
Conflict ©   (2011-03-10 17:50) [1]

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


 
sniknik ©   (2011-03-10 17:53) [2]

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


 
harisma ©   (2011-03-10 18:14) [3]

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


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


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


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


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


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

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


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

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


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


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


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


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

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


 
KilkennyCat ©   (2011-03-10 19:50) [9]


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

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


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

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


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


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

- прямо так и называется:
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-11 09:09) [12]

> han_malign   (11.03.11 08:48) [11]

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


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

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


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

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


 
sniknik ©   (2011-03-11 10:21) [15]

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

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



Страницы: 1 вся ветка

Текущий архив: 2011.06.19;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.007 c
2-1299837557
i7
2011-03-11 12:59
2011.06.19
Как избавиться от ошибок сокетов


2-1299755437
harisma
2011-03-10 14:10
2011.06.19
Как оптимизировать кусок кода?


2-1299748767
laby
2011-03-10 12:19
2011.06.19
При вызове sp часики убрать


2-1300117377
HannibalSmith23
2011-03-14 18:42
2011.06.19
Задача Delphi


2-1299926254
Сергей
2011-03-12 13:37
2011.06.19
Проблемы с запуском программы