2011-03-10 3 views
20

में एक स्ट्रिंग होने की संख्या की गिनती संख्या मैं डेल्फी 2007 का उपयोग कर रहा हूं और सोच रहा हूं कि किसी अन्य स्ट्रिंग में स्ट्रिंग की संख्या कितनी बार गिनती है। कोई भी बिल्टिन फ़ंक्शन जिसका मैं उपयोग कर सकता हूं?डेल्फी: किसी अन्य स्ट्रिंग

उदाहरण: "? आप कैसे हैं"

  • "कैसे" स्ट्रिंग में एक बार होता है
  • "डू" स्ट्रिंग में दो बार होता है "आप कैसे करते हैं?"

उत्तर

37
function Occurrences(const Substring, Text: string): integer; 
var 
    offset: integer; 
begin 
    result := 0; 
    offset := PosEx(Substring, Text, 1); 
    while offset <> 0 do 
    begin 
    inc(result); 
    offset := PosEx(Substring, Text, offset + length(Substring)); 
    end; 
end; 
+2

2 PosEx लिखा जा सकता है "ऑफसेट: = PosEx (-स्ट्रिंग, पाठ, + लंबाई (स्ट्रिंग) ऑफसेट)," अगर आप बार-बार होने सबस्ट्रिंग के बारे में परवाह नहीं है। ;) –

+1

@ ए बॉचेज: हाँ, यह बहुत सच है। मैं यह भी कहूंगा कि आपको सबस्ट्रिंग की वास्तविक लंबाई का उपयोग करना चाहिए * विशेष रूप से * यदि आप 'रोगी) (' ddd ',' dddddddd ') जैसे (पैथोलॉजिकल) इनपुट की परवाह करते हैं। मैंने इसे बदल दिया है। बेशक, प्रदर्शन के लिए लूप से पहले 'len: = length (substring)' को सहेजना एक अच्छा विचार है (या यह संकलक स्वयं को अनुकूलन करने के लिए पर्याप्त स्मार्ट है?)। –

+1

+1 मैं संभवतः एक var का उपयोग करता हूं और लंबाई में बार-बार कॉल से बचने के लिए इसमें सबस्ट्रिंग की लंबाई संग्रहीत करता हूं, लेकिन चूंकि लंबाई वास्तव में केवल @SubString से नकारात्मक ऑफ़सेट पढ़ती है, तो शायद यह प्रदर्शन प्रदर्शन में से अधिकतर नहीं है । :) –

8

सबसे चतुर तरीके मैंने कभी यह करने के लिए देखा है में से एक:

{ Returns a count of the number of occurences of SubText in Text } 
function CountOccurences(const SubText: string; 
          const Text: string): Integer; 
begin 
    if (SubText = '') OR (Text = '') OR (Pos(SubText, Text) = 0) then 
    Result := 0 
    else 
    Result := (Length(Text) - Length(StringReplace(Text, SubText, '', [rfReplaceAll]))) div Length(subtext); 
end; { CountOccurences } 
+0

हां, यह एक बहुत चालाक तरीका है। असल में, आरआरयूजेड ने कल इस विधि को एक जवाब के रूप में पोस्ट किया, लेकिन फिर, किसी कारण से, उसने इसे हटा दिया। मैंने अपने प्रश्न को दी गई टिप्पणी * ठीक है, यह वास्तव में एक "विशेष संस्करण" है। प्रदर्शन-वार, हालांकि, यह आदर्श से बहुत दूर है, मुझे डर है ... * ईमानदार होने के लिए, मुझे लगता है कि इस विधि का उपयोग करने का कोई कारण नहीं है जब अधिक प्रदर्शन करने वाले लोग अधिक पूर्ण नहीं होते हैं। फिर भी, अगर आपको ऐसा करने से आरआरयूजेड के लिए बुरा महसूस नहीं हुआ तो मैं आपको +1 दूंगा ... –

+0

ठीक है, मैं आपको वैसे भी एक +1 देता हूं। चूंकि आपको "केवल" 1683 में प्रतिनिधि मिला है, इसलिए आप हटाए गए पोस्ट नहीं देख सकते हैं। लेकिन अगर आरआरयूजेड अपने प्रश्न को मिटा देता है, तो मैं वादा करता हूं कि मैं उसे +1 भी दूंगा। –

+1

चालाक, लेकिन धीमी, और स्मृति को बर्बाद कर देता है। –

4

आप पाते हैं अपने आप को बार-बार एक बड़े पाठ के शरीर में आवृत्तियां खोज और प्रदर्शन एक हो जाता है मुद्दा, आप Boyer-Moore search algorithm आज़मा सकते हैं।

बुरी से बुरी हालत डेल्फी में एक कार्यान्वयन पाया जा सकता है पर हमारे बहुत ही एसओ here

मैं की जरूरत है सभी घटनाओं खोजने के लिए एक पाठ लगभग 3n तुलना

की जरूरत है तीन फास्ट-ऑन-लार्ज-स्ट्रिंग्स फ़ंक्शंस: फास्ट सर्च, फास्ट सर्च और स्ट्रिंग में सबस्ट्रिंग्स की तेज़ गिनती और तेज़ गिनती।

+1

+1 यह जानने के लिए कि बॉयर-मूर खोज क्या है। –

1

uses 
    StrUtils;  

function Occurrences(const Substring, Text: string; 
    const ignoreUppercase: Boolean = false): Integer; 
var 
    inSubstring, inText: string; 
    inPos: Integer; 
begin 
    Result:= 0; 

    if (Substring = '') or (Text = '') then 
    Exit; 

    if ignoreUppercase then 
    begin 
    inSubstring:= AnsiLowerCase(Substring); 
    inText:= AnsiLowerCase(Text); 
    end 
    else 
    begin 
    inSubstring:= Substring; 
    inText:= Text; 
    end; 

    inPos:= 1; 

    repeat 
    inPos:= posEx(inSubstring, inText, inPos); 
    if inPos > 0 then 
    begin 
     Inc(Result); 
     inPos:= inPos + Length(inSubstring); 
    end; 
    until inPos = 0; 
end; 

+1

कृपया कोड कोड स्निपेट के उत्तर देने के बजाए अपने कोड का कुछ वर्णन, या स्पष्टीकरण शामिल करें। – davidcondrey

+1

यह स्वीकृत उत्तर पर भिन्नता की तरह दिखता है। क्या आप समझा सकते हैं कि यह अलग क्यों है, और इस तरह से क्या करने के फायदे हैं? – andrewsi

+0

इस मामले में लूप "दोहराना" का उपयोग करना अधिक सुरुचिपूर्ण है, क्योंकि खोज कम से कम एक बार आयोजित की जानी चाहिए। – GoodMan