PDA

Показать полную графическую версию : Найти и удалить дубли строк


KonVi_SEO@twitter
25-10-2017, 20:13
Добрый день!
Пишу небольшую программулину для работы, почти все функции реализовал, но осталась одна, которую не могу решить. Короче, выкладываю суть вопроса:
Есть поле Memo1 в нем строки вида:
смартфоны цены
смартфоны
недорогие смартфоны
лучшие смартфоны
купить хороший смартфон
купить смартфон цена
купить смартфон в спб
купить смартфон в магазине
купить смартфон в интернет магазине

нужна функция, которая удалит строки с вхождением слов из других строк
к примеру, есть две строки:
смартфоны
недорогие смартфоны
должна остаться:
недорогие смартфоны
так как первая строка содержит текст, который есть в строке два
при обработке строк должно получиться:
источник:
смартфоны цены
смартфоны
недорогие смартфоны
лучшие смартфоны
купить хороший смартфон
купить смартфон цена
купить смартфон в спб
купить смартфон в магазине
купить смартфон в интернет магазине

Получили:
недорогие смартфоны
лучшие смартфоны
купить хороший смартфон
купить смартфон цена
купить смартфон в спб
купить смартфон в интернет магазине


Вот что я написал (точнее подсказал Alexander Gamza):
AnsiString SearchStr;

for(int i=0; i<Memo1->Lines->Count; i++){
SearchStr = Memo1->Lines->Strings[i];

for(int j=i+1; j<Memo1->Lines->Count; j++)
{
if(Memo1->Lines->Strings[j].Pos(SearchStr))
Memo1->Lines->Delete(i);

}//end for j
}//end for i
но функция работает не корректно((
помогите!

lxa85
27-10-2017, 11:42
Из ответов для "разобраться". Возможно полезным будет посмотреть на исходные коды meldmerge (http://meldmerge.org/development.html) и
winmerge (https://sourceforge.net/projects/winmerge/)

KonVi_SEO@twitter
27-10-2017, 23:51
спасибо конечно за ответ, но мне нужно одно решение)
Думаю много времени займет разбор документов)

Busla
28-10-2017, 11:14
KonVi_SEO@twitter, у вас в коде "каша". Цикл по Lines, а обращаетесь к Strings.
удалять надо по индексу вложенного цикла (и переписать условие), либо выходить из него после удаления. Сейчас внутренний цикл продолжает сравнивать со строкой, которой уже нет в массиве.

KonVi_SEO@twitter
28-10-2017, 20:12
покажете как правильно?

Busla, Busla, покажете как правильно?)

lxa85
29-10-2017, 18:54
KonVi_SEO@twitter, спрошу иначе.
Вы хотите разбираться в том, как это работает?
Или вам нужно "коробочное решение" из разряда подал массив строк на вход, получил фильтрованный массив на выходе?
Сколько у вас есть времени разбираться с данной задачей?
Так ли необходимо использовать язык С++ или это может быть какой-либо иной?

Ylik
05-12-2017, 12:21
Неправильно формулируете задачу. Если её решать буквально, то получится чушь.

1. раз два
2. два три

Обе строи будут удалены, т.к. каждая удовлетворяет условию для удаления :)




© OSzone.net 2001-2012