Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.06.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.003 c
2-1300221363
Scott Storch
2011-03-15 23:36
2011.06.19
Добавление в таблицу БД


15-1298375142
Empleado
2011-02-22 14:45
2011.06.19
Goto in Delphi


15-1299164683
bad man
2011-03-03 18:04
2011.06.19
бинарные операции


15-1299015000
Юрий
2011-03-02 00:30
2011.06.19
С днем рождения ! 2 марта 2011 среда


15-1298842202
Юрий
2011-02-28 00:30
2011.06.19
С днем рождения ! 28 февраля 2011 понедельник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский