Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Найти и удалить дубли строк (http://forum.oszone.net/showthread.php?t=330774)

KonVi_SEO@twitter 25-10-2017 20:13 2773365

Найти и удалить дубли строк
 
Добрый день!
Пишу небольшую программулину для работы, почти все функции реализовал, но осталась одна, которую не могу решить. Короче, выкладываю суть вопроса:
Есть поле 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 2773673

Из ответов для "разобраться". Возможно полезным будет посмотреть на исходные коды meldmerge и
winmerge

KonVi_SEO@twitter 27-10-2017 23:51 2773864

спасибо конечно за ответ, но мне нужно одно решение)
Думаю много времени займет разбор документов)

Busla 28-10-2017 11:14 2773934

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

KonVi_SEO@twitter 28-10-2017 20:12 2774015

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

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

lxa85 29-10-2017 18:54 2774160

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

Ylik 05-12-2017 12:21 2782444

Неправильно формулируете задачу. Если её решать буквально, то получится чушь.

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

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


Время: 16:21.

Время: 16:21.
© OSzone.net 2001-