Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Подсчёт кол-ва определенной подстроки в строке


Автор: Alca 2.7.2007, 21:52
Код

unsigned int iCountDelimiter = 0;

TStringList* pList = new TStringList(); 
pList->LoadFromFile(asFilePath);

for (int i = 0; i < pList->Text.Length(); i ++) {
    if (pList->Text.SubString(i, cbbDelimiter->Text.Length()) == cbbDelimiter->Text) {
        iCountDelimiter ++;
    }
} 

//cbbDelimiter->Text - строка, кол-во которой необходимо найти


Помоги оптимизировать, т.к. кол-во строк в файле в районе 50000-100000,
слишко долго считает...

Автор: mr.Anderson 2.7.2007, 22:07
А она вообще работает? По коду складывается впечатление, что нет.

Вот мой вариант. Не проверял.
Код

AnsiString src = pList->Text;
AnsiString inString = cbbDelimeter->Text;

int count = 0;

do {
 int pos = AnsiPos(  

 if( AnsiPos( inString, src ) )
 ++count;

 src = src.SetLength( i + pos + 1 );
} while( src.Length() > 0 );

Теоретически должно работать. Повторяю, не проверено.

Автор: Alca 2.7.2007, 22:22
Не работает

Автор: mr.Anderson 2.7.2007, 22:25
Alca, может быть. smile Проверить негде. Ты прежде чем оптимизировать хотя бы работать ее заставь. Золотое правило: сначала программу надо заставить работать, затем заставить ее работать правильно, и только потом заняться оптимизацией.

Автор: Grom 23.9.2008, 11:48
может кому пригодится подсчет количества вхождений подстроки в строку
Код

CountPos (AnsiString str, AnsiString substring)
{
 int CountPos;
 CountPos = (strlen(str.c_str()) - strlen((StringReplace(str,substring,"",TReplaceFlags()<<rfReplaceAll)).c_str()))/strlen(substring.c_str());
 return CountPos;
}


использование
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ShowMessage(CountPos("001001","001"));
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)