1 / 1 / 2
Регистрация: 15.08.2017
Сообщений: 81

Удаление строк

29.10.2017, 02:40. Показов 2292. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Я сам не программист, но вышло так, что нужно написать небольшую программулину для работы. Вроде все хорошо и прога работает, но нужно реализовать одну функцию, а понять как это сделать не могу, может кто подскажет. Короче, суть функции:

нужно сделать функцию, которая будет делать так:
есть Memo1 в нем строки вида:

копать глубокую яму
яму глубокую копать
яму глубокую выкопать яша
катя яму глубокую выкопать

на выходе должно получаться так:
яму глубокую выкопать яша
катя яму глубокую выкопать

то есть, если допустим все слова из строки один, есть в строке два, то строку один - удалять

Спасибо программисты на перед)

Добавлено через 2 часа 3 минуты
по сути нужно сравнить строчки, к примеру, расскажу на примере двух строк:
в Мемо есть строки:

миша бежит по полю
миша бежит по полю летом

нужно удалить строку если в другой строке есть все слова из нее, в результате должно получится:

миша бежит по полю летом

Была написана такая функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
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
но она работает в случае если порядок слов в строках одинаковый(((
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.10.2017, 02:40
Ответы с готовыми решениями:

Удаление похожих строк
Доброго дня.Появилось проблема, но тем похожих много на форуме. Может кто подскажет конкретно в моем случаи Имеется много файлов , мне...

Удаление одинаковых строк
Доброе время суток, подскажите, правильно ли я делаю удаление одинаковых строк? сам код рабочий, но вот незадача... очень долго...

Удаление строк из ListBox
подскажи те плиз как удалить все строки из ListBox1 void __fastcall TForm1::remaccClick(TObject *Sender) { TStringList *s =...

39
1 / 1 / 2
Регистрация: 15.08.2017
Сообщений: 81
29.10.2017, 21:48  [ТС]
Студворк — интернет-сервис помощи студентам
Строки:
копать глубокую яму
яму глубокую копать
есть в
яму глубокую копать яша
катя яму глубокую копать

сделал опечатку в слове "копать" , хотель написать "выкопать" и тормознул...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33465 / 21564 / 8249
Регистрация: 22.10.2011
Сообщений: 37,017
Записей в блоге: 12
29.10.2017, 21:51
Ничего не понял. Давай несколько примеров: что есть и что должно остаться после работы алгоритма. Только без ошибок. Проверяй, что пишешь. Тут не чат Формулы 1...
1
1 / 1 / 2
Регистрация: 15.08.2017
Сообщений: 81
29.10.2017, 21:56  [ТС]
Понял, админ, извини за мою тупость, сейчас покажу что на входе и что должно быть на выходе:

Входные данные:
гранитный памятник
гранитный памятник харьков
гранитный памятник цена
купить гранитный памятник
гранитный памятник харьков цена
гранитный памятник фото
гранитный памятник новый
купить гранитный памятник цена
элитный гранитный памятник
гранитный памятник фото и цена
гранитный памятник на могила
гранитный памятник каталог
гранитный памятник фирма
изготовление гранитный памятник
памятник из гранитный крошка цена
памятник из гранитный крошка
памятник из гранитный крошка фото цена


На выходе должно быть:
гранитный памятник харьков цена
гранитный памятник новый
купить гранитный памятник цена
элитный гранитный памятник
гранитный памятник фото и цена
гранитный памятник на могила
гранитный памятник каталог
гранитный памятник фирма
изготовление гранитный памятник
памятник из гранитный крошка фото цена
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
29.10.2017, 22:40
ну а если есть такие строки.
гранитный памятник
гранитный памятник памятник
что с ними? удалить? кого из двух?
0
1 / 1 / 2
Регистрация: 15.08.2017
Сообщений: 81
29.10.2017, 22:41  [ТС]
удалить вот эту "гранитный памятник"

Добавлено через 23 секунды
я тут наверное всех уже достал
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
29.10.2017, 22:57
Лучший ответ Сообщение было отмечено дно21 как решение

Решение

но если не удалять строки а просто их закоментировать. то все срабатывает правильно .

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    TStringList * sh = new TStringList();
 
    for (int i = 0; i<Memo1->Lines->Count; i++)
    {
sh->Clear();
sh->Text = Memo1->Lines->Strings[i].LowerCase(); //
sh->Text = StringReplace(sh->Text, " ", "\n", TReplaceFlags() << rfReplaceAll);
 for (int ii=0; ii<Memo1->Lines->Count; ii++)
 {
 int mach = 0;
 if( ii!=i  )
             {
      for(int cq = 0; cq<sh->Count; cq++)
   {
  if (
  Memo1->Lines->Strings[ii].LowerCase().Pos(sh->Strings[cq]) !=0
     ) mach++;
   }
   if(mach==sh->Count)// если найденные все слова в поиске
   {
 Memo1->Lines->Strings[i]="*";// Memo1->Lines->Delete(i);
   }
             }
 }
 
    }
 
  sh=NULL;
  delete sh;

Входные данные:
гранитный памятник
гранитный памятник харьков
гранитный памятник цена
купить гранитный памятник
гранитный памятник харьков цена
гранитный памятник фото
гранитный памятник новый
купить гранитный памятник цена
элитный гранитный памятник
гранитный памятник фото и цена
гранитный памятник на могила
гранитный памятник каталог
гранитный памятник фирма
изготовление гранитный памятник
памятник из гранитный крошка цена
памятник из гранитный крошка
памятник из гранитный крошка фото цена

На выходе
*
*
*
*
гранитный памятник харьков цена
*
гранитный памятник новый
купить гранитный памятник цена
элитный гранитный памятник
*
гранитный памятник на могила
гранитный памятник каталог
гранитный памятник фирма
изготовление гранитный памятник
*
*
памятник из гранитный крошка фото цена
так пойдет?

Добавлено через 3 минуты
здесь удалилось
гранитный памятник фото и цена
1
1 / 1 / 2
Регистрация: 15.08.2017
Сообщений: 81
29.10.2017, 23:01  [ТС]
Этот работает лучше))
понял почему удалилось:
гранитный памятник фото и цена
все слова из данной строки есть в:
памятник из гранитный крошка фото цена
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
29.10.2017, 23:07
все правильно! в строке гранитный памятник фото и цена есть буква и а в
строке памятник из гранитный крошка фото цена есть из
. вот и удаление совпадения.
можно еще и проверять длину слова, тогда будет по более точному совпадению удаление.
0
1 / 1 / 2
Регистрация: 15.08.2017
Сообщений: 81
29.10.2017, 23:09  [ТС]
от сего момента lifeforce для меня настоящий ЭНЩЕЙН
бро, у тебя получилось то, что я не мог сделать пару недель!
я в восторге
0
29.10.2017, 23:12

Не по теме:

Цитата Сообщение от lifeforce Посмотреть сообщение
C++
1
2
sh=NULL; 
delete sh;
Действительно дважды гениально :sarcasm:

0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
29.10.2017, 23:13
можно добавить условие
C++
1
2
3
4
  if (
  Memo1->Lines->Strings[ii].LowerCase().Pos(sh->Strings[cq]) !=0
  && sh->Strings[cq].Length()>1// если больше одного символа
     ) mach++;
проверь все работает
0
1 / 1 / 2
Регистрация: 15.08.2017
Сообщений: 81
29.10.2017, 23:15  [ТС]
Можешь написать как уже будет выглядеть готовый код?)
а то я еще вставлю еще условие куда-то никуда))))
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
29.10.2017, 23:18
Лучший ответ Сообщение было отмечено дно21 как решение

Решение

Не по теме:

Avazart, не придирайся к копипасту .



Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void __fastcall TForm2::Button1Click(TObject *Sender)
{
    TStringList * sh = new TStringList();
 
    for (int i = 0; i<Memo1->Lines->Count; i++)
    {
sh->Clear();
sh->Text = Memo1->Lines->Strings[i].LowerCase(); //
sh->Text = StringReplace(sh->Text, " ", "\n", TReplaceFlags() << rfReplaceAll);
 for (int ii=0; ii<Memo1->Lines->Count; ii++)
 {
 int mach = 0;
 if( ii!=i  )
             {
      for(int cq = 0; cq<sh->Count; cq++)
   {
  if (
  Memo1->Lines->Strings[ii].LowerCase().Pos(sh->Strings[cq]) !=0
  && sh->Strings[cq].Length()>1
     ) mach++;
   }
   if(mach==sh->Count)// если найденные все слова в поиске
   {
 Memo1->Lines->Strings[i]="*";// Memo1->Lines->Delete(i);
   }
             }
 }
 
    }
 
 
  delete sh;
}
1
1 / 1 / 2
Регистрация: 15.08.2017
Сообщений: 81
29.10.2017, 23:28  [ТС]
В честь человека избавившего меня от мучений, назвал элемент обработки
Спасибо бро что ты есть и за то не прошел мимо и действительно помог мне!
наверное первый человек на форумах, который не шутил, не дерзил, не издевался и не кидался сарказмами, а действительно помог!
Миниатюры
Удаление строк  
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
29.10.2017, 23:31
можно еще и удалить все строки с символом *
0
1 / 1 / 2
Регистрация: 15.08.2017
Сообщений: 81
29.10.2017, 23:36  [ТС]
????????????

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

повесил на форму кнопку для удаления "*"
Code
1
2
3
4
5
6
for ( int i = Memo1->Lines->Count - 1; i >= 0; i-- ) {
 //CGauge1->Progress = i;
 if ( Memo1->Lines->Strings[i] == "*") {
            Memo1->Lines->Delete( i );
        }
         }
после работы функции и ручного осмотра строк, буду ее жмякать
1
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
29.10.2017, 23:41
Рад что быстро схватываешь!
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.10.2017, 00:02
Цитата Сообщение от lifeforce Посмотреть сообщение
Avazart, не придирайся к копипасту .
Да и игнорирование умных указателей.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33465 / 21564 / 8249
Регистрация: 22.10.2011
Сообщений: 37,017
Записей в блоге: 12
30.10.2017, 13:14
Вот то решение, которое предлагал я:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    std::auto_ptr<TStringList> what(new TStringList); // #include <memory>
    std::auto_ptr<TStringList> loop(new TStringList);
    TSysCharSet ch; TStrings *L = Memo1->Lines;
 
    for (int i = 0; i < L->Count; i++)
    {
        what->Clear(); // я почему-то всегда был уверен, что это должно делаться автоматически в ExtractStrings, ан нет...
        ExtractStrings(ch << ' ', ch, L->Strings[i].LowerCase().c_str(), what.get());
        for (int j = 0; j < Memo1->Lines->Count; j++)
        {
            if (i == j || L->Strings[j] == "*") continue;
            loop->Clear();
            ExtractStrings(ch << ' ', ch, L->Strings[j].LowerCase().c_str(), loop.get());
            if (loop->Count > what->Count)
            {
                bool contained = true;
                for (int k = 0; contained && k < what->Count; contained = (loop->IndexOf(what->Strings[k++]) != -1));
                if (contained)
                {
                    L->Strings[i] = "*"; break;
                }
            }
        }
    }
}
2
1 / 1 / 2
Регистрация: 15.08.2017
Сообщений: 81
30.10.2017, 13:33  [ТС]
Вариант функции от volvo работает, ее результат равен результату работы функции от lifeforce .
Тестил на 10 разных выборках, результаты одинаковые!! Ничья 1:1
Спасибо volvo за отличный вариант реализации обработчика
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.10.2017, 13:33

Удаление строк StringGrid
Задание: нужно вывести приборы с их параметрами(не суть, какие) и сравнить их с параметрами, вводимыми пользователем. Есть кнопка Найти...

Удаление одинаковых строк Листбокс
Делаю игру алхимия и там добавляются одинаковые строки в лисбокс, а как сделать чтоб они одинаковые недобавлялись? или если добавились то...

Удаление пустых строк в StringGrid
Подскажите пожалуйста каким образом удалить все пустые строки в StringGrid? Заранее благодарен.

Удаление одинаковых строк в StringGrid1
Как в StringGrid удалить абсолютно одинаковые строчки? Пробовал переделать найденный код для делфи на билдер, но не вышло..

Std + удаление пустых строк
Доброго вечера.Ребята подскажите как удалить пустые строки из std::string s; То как то не выходит


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru