Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1

Поиск по условию в TStringList

09.04.2013, 12:25. Показов 3767. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят подскажите нужно сравнить 2 списка
В списках по 10000 строк
Составил алгоритм, но он работает очень медлено , в маленьких списках - все безупречно )
Суть в том
вот к примеру 2 списка
Code
1
2
3
4
5
6
7
Дима П42  программист 
Маша П42  программист
Инесса П42  программист
 
Д2има П42  программист 
Маш1а П42  программист
Ине2сса П42  программист
т.е эти строки == т.к сравниваются значения после группы П-42 и она постоянна
и удаляем дубликаты с 1 списка
Мой код работает, но очень долгая обработка + в list и list2 пишутся и обрезанные строки и не обрезанные
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
34
35
36
37
38
    Memo5->Clear();
    list->Clear();
    list2->Clear();
    Application->ProcessMessages();
    for(int j=0; j<Memo1->Lines->Count; j++)
    {
        String use=Memo1->Lines->Strings[j].Trim();
        list2->Add(use.SubString(use.Pos("Ï42"),use.Length()));
 
 
        Application->ProcessMessages();
    }
    for(int l=0; l<Memo3->Lines->Count; l++)
    {
        String use2=Memo3->Lines->Strings[l].Trim();
        list->Add(use2.SubString(use2.Pos("Ï42"),use2.Length()));
        Application->ProcessMessages();
    }
    for(int i=0; i<list->Count; i++)  {
        for(int j=0; j<list2->Count; j++) {
            if( list->Strings[i] == list2->Strings[j] )
            {
                Memo5->Lines->Add(list->Strings[i].Trim());
                Application->ProcessMessages();
            }
        }
    }
    for(int l=0; l<Memo3->Lines->Count; l++)
        for(int t=0; t<Memo5->Lines->Count; t++)
        {
            {
                if(Memo3->Lines->Strings[l].Pos(Memo5->Lines->Strings[t]))
                {
                    Memo3->Lines->Delete(Memo3->Lines->IndexOf(Memo3->Lines->Strings[l]));
                    Application->ProcessMessages();
                }
            }
        }
Может кто подскажет в чём причина?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.04.2013, 12:25
Ответы с готовыми решениями:

Поиск подстроки в TStringList
Помогите исправить код, нужно найти в stringliste все начальные пробелы в строке и удалить их, сделать в memo могу, но это слишком долго,...

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

Неясности с TStringList. Как найти наибольший элемент в TStringList?
Добрый день. Проблема следующая: мне надо в TStringList найти самую длинную строчку. Пытаюсь проверять по Length(sl) &gt; Length(sl) - не...

10
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
09.04.2013, 12:34
Попробуй не работать с мемо в цикле, а сначала скопировоть содержимое в стринглист, потом пройтись по нему в цикле, и результат опять записать в мемо.
ну и Application->ProcessMessages(); убрать...
1
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
09.04.2013, 13:20
Попробуйте применить BeginUpdate и EndUpdate, чтобы предотвратить перерисовку Memo в процессе обработки. Если, конечно, вам не надо визуально следить за работой. Не знаю как это записать на Builder, а на Delphi так:
Delphi
1
2
3
4
  Memo1.Lines.BeginUpdate;
  for i := 1 to 5000 do
    Memo1.Lines.Add('abcd');
  Memo1.Lines.EndUpdate;
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
09.04.2013, 13:39  [ТС]
У меня вся проблема в том, что
C++
1
list->Add(use2.SubString(use2.Pos("П42"),use2.Length()));
Добавляет в list
Code
1
2
Дима П42  программист
П42  программист
а должен только
Code
1
П42  программист
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
09.04.2013, 13:55
Цитата Сообщение от Ddv122 Посмотреть сообщение
use2.Length()
должно быть длиной выделяемой подстроки, а у вас длина всей строки. То есть вместо этого надо написать что-то вроде:
C++
1
use2.Length()-use2.Pos("П42")+1
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
09.04.2013, 14:17
на счёт длины верное замечание, лучше исправить, только ошибка не в этом. И эта строчка
Цитата Сообщение от Ddv122 Посмотреть сообщение
list->Add(use2.SubString(use2.Pos("П42"),use2 .Length()));
никак не может добавлять две. Проблема где-то в другом месте. Покажи, какой сейчас стал код
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
09.04.2013, 15:00
Цитата Сообщение от palva Посмотреть сообщение
должно быть длиной выделяемой подстроки, а у вас длина всей строки. То есть вместо этого надо написать что-то вроде:
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
на счёт длины верное замечание, лучше исправить
Замечание это неверное и исправлять таким образом - только тратить зазря ресурсы компупера.
Метод SubString в любом случае проверяет оба параметра на валидность и если второй параметр превосходит скромные возможности строки, подставляется максимально возможное значение. И делается это шустрее и эффективнее, чем всякие нагромождения типа use2.Length()-use2.Pos("П42")+1.
1
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
09.04.2013, 15:48
BRcr, Да, я не прав. Хотел сразу же написать, да уходил за пивом.
1
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
09.04.2013, 15:48
Так должно работать пошустрее, если я правильно понял задачу.
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
    String use;
    TStrings *m1_lines( Memo1->Lines ), *m3_lines( Memo3->Lines ), *m5_lines( Memo5->Lines );
 
    Memo5->Clear( );
    list->Clear( );
    list2->Clear( );
 
    for ( size_t i( 0 ), end( m1_lines->Count ); i < end; ++i )
    {
        use = m1_lines->Strings[i].Trim( );
        list2->Add( use.SubString( use.Pos( "П42" ), use.Length( ) ) );
    }
    for ( size_t i( 0 ), end( m3_lines->Count ); i < end; ++i )
    {
        use = m3_lines->Strings[i].Trim( );
        list->Add( use.SubString( use.Pos( "П42" ), use.Length( ) ) );
    }
    m5_lines->BeginUpdate( );
    m3_lines->BeginUpdate( );
    for ( size_t i( 0 ), i_fix( 0 ), k, end( list->Count ), end2( list2->Count ); i < end; ++i, ++i_fix )
    {
        for ( k = 0; k < end2; ++k )
        {
            if ( list->Strings[i] == list2->Strings[k] )
            {
                m5_lines->Add( list->Strings[i] );
                m3_lines->Delete( i_fix-- );
                break;
            }
        }
    }
    m5_lines->EndUpdate( );
    m3_lines->EndUpdate( );
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.04.2013, 16:14
Цитата Сообщение от Ddv122 Посмотреть сообщение
Мой код работает, но очень долгая обработка + в list и list2 пишутся и обрезанные строки и не обрезанные
А то ...

1. Не использовать VCL- медленно,криво итп, а использовать стандартные средства С/С++
2. Использовать потоки.
1
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
12.04.2013, 17:46
Упростил схему и удалил лишнее, должно работать еще пошустрее.
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
    std::auto_ptr < TStringList > list( new TStringList( ) );
    String use, removed;
    TStrings * m1_lines( memo1->Lines ), * m3_lines( memo3->Lines ), * m5_lines( memo5->Lines );
 
    for ( size_t i( 0 ), end( m3_lines->Count ), pos; i < end; ++i )
    {
        use = m3_lines->Strings[i].Trim( );
        if ( pos = use.Pos( "PCI\\VEN" ) )
        {
            list->Add( use.SubString( pos, use.Length( ) ) );
        }
    }
    memo5->Clear( );
    m5_lines->BeginUpdate( );
    m3_lines->BeginUpdate( );
    for ( size_t i( 0 ), end( m3_lines->Count ), pos; i < end; ++i )
    {
        use = m1_lines->Strings[i].Trim( );
        if ( ( pos = use.Pos( "PCI\\VEN" ) ) &&
            list->IndexOf( removed = use.SubString( pos, use.Length( ) ) ) >= 0 )
        {
            m5_lines->Add( removed );
            m1_lines->Delete( i-- );
            --end;
        }
    }
    m5_lines->EndUpdate( );
    m3_lines->EndUpdate( );
А в поток загнать, так вообще красиво будет. Только придется делать копии обоих списков.
Миниатюры
Поиск по условию в TStringList  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.04.2013, 17:46
Помогаю со студенческими работами здесь

Зашифровать TStringList, сохранить, прочитать, получить исходный TStringList
Здравствуйте. Требуется решение следующей задачи: Зашифровать TStringList (количество строк может достигать 3-5 тысяч строк),...

E2034 Cannot convert 'TStringList' to 'TStringList *'
Всем привет! Пытаюсь сделать так чтобы можно было выбрать неограниченное количество файлов, но почему то ругается... TStringList **Ffile;...

Поиск по условию
Нужно найти число &quot;C&quot; по условию: &quot;A&quot; &lt; &quot;C&quot; &lt; &quot;B&quot;. Как можно составить такой SQL запрос?

Поиск файлов по условию
Добрый вечер) &quot;Выдать список имен всех файлов (обычных), принадлежащих пользователям, имена которых перечислены как параметры...

Поиск строк по условию
как обеспечить быстрый поиск нужных строк по введенной строке, каждое слово введенной строки должно быть минимум частью слов искомых: ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru