2014-09-19 5 views
22

मैं किसी अन्य स्ट्रिंग में एक स्ट्रिंग दिखाई देने की संख्या को गिनने की कोशिश कर रहा हूं।रूबी: किसी अन्य स्ट्रिंग में स्ट्रिंग कितनी बार दिखाई देती है?

मुझे पता है तुम समय की संख्या एक पत्र एक स्ट्रिंग में प्रकट होता है भरोसा कर सकते हैं:

string = "aabbccddbb" 
string.count('a') 
=> 2 

लेकिन अगर मैं कितनी बार 'आ' इस स्ट्रिंग में प्रकट होता है के लिए खोज, मैं भी दो मिलता है।

string.count('aa') 
=> 2 

मुझे यह समझ में नहीं आता है। मैंने मूल्य उद्धरण चिह्नों में रखा है, इसलिए मैं केवल अक्षरों के लिए सटीक स्ट्रिंग दिखाई देने की संख्या की खोज कर रहा हूं।

+2

कृपया स्पष्टीकरण (एक संपादन के साथ): '' aa'' 'aa''' स्ट्रिंग में एक या दो बार दिखाई देता है। –

+0

यह उस मामले में शायद दो बार होना चाहिए।पद 0 और 1 और स्थिति 1 और 2 – Johnson

+0

निश्चित रूप से, आप एक उत्कृष्ट पोस्टर हैं। मैंने आपको कैरी स्वोवलैंड को पुरस्कृत किया। – Johnson

उत्तर

26

यहां कुछ ऐसे तरीके दिए गए स्ट्रिंग एक स्ट्रिंग में दिखाए जाने की संख्या की गणना करें के एक जोड़े हैं (पहले मेरी प्राथमिकता किया जा रहा है):

समय की संख्या aa स्ट्रिंग में प्रकट होता है गिनती करने के लिए। नोट इसलिए पाँच में बार (ओपी द्वारा के रूप में पुष्टि) सबस्ट्रिंग 'aa' स्ट्रिंग 'aaa' में दो बार होता है, और:

string="aaabbccaaaaddbb" 

# 1

एक regex कि एक सकारात्मक अग्रदर्शी शामिल साथ उपयोग String#scan कि

def count_em(string, substring) 
    string.scan(/(?=#{substring})/).count 
end 

count_em(string,"aa") 
#=> 5 

नोट::

-स्ट्रिंग के लिए लग रहा है

एक सकारात्मक lookbehind एक ही परिणाम का उत्पादन:

"aaabbccaaaaddbb".scan(/(?<=aa)/) 
    #=> ["", "", "", "", ""] 

# 2

एक सरणी में कनवर्ट, लागू Enumerable#each_cons, तो में शामिल होने और गिनती:

def count_em(string, substring) 
    string.each_char.each_cons(substring.size).map(&:join).count(substring) 
end 

count_em(string,"aa") 
    #=> 5 

हम:

enum0 = "aaabbccaaaaddbb".each_char 
    #=> #<Enumerator: "aaabbccaaaaddbb":each_char> 

हम तत्वों है कि इस प्रगणक द्वारा उत्पन्न होगा देख सकते हैं एक सरणी के लिए इसे परिवर्तित करके:

enum0.to_a 
    #=> ["a", "a", "a", "b", "b", "c", "c", "a", "a", "a", 
    # "a", "d", "d", "b", "b"] 

enum1 = enum0.each_cons("aa".size) 
    #=> #<Enumerator: #<Enumerator: "aaabbccaaaaddbb":each_char>:each_cons(2)> 

Convert enum1 एक सरणी को देखने के लिए कौन-से मान प्रगणक map तक पहुंचाया जाएगा:

enum1.to_a 
    #=> [["a", "a"], ["a", "a"], ["a", "b"], ["b", "b"], ["b", "c"], 
    # ["c", "c"], ["c", "a"], ["a", "a"], ["a", "a"], ["a", "a"], 
    # ["a", "d"], ["d", "d"], ["d", "b"], ["b", "b"]] 

c = enum1.map(&:join) 
    #=> ["aa", "aa", "ab", "bb", "bc", "cc", "ca", 
    # "aa", "aa", "aa", "ad", "dd", "db", "bb"] 
c.count("aa") 
    #=> 5 
15

ऐसा इसलिए है क्योंकि countवर्ण की गणना करता है, स्ट्रिंग के उदाहरण नहीं। इस मामले में 'aa' का अर्थ 'a' जैसा ही है, इसे गिनने के लिए वर्णों का एक सेट माना जाता है।

string = "aabbccddbb" 
string.scan(/aa/).length 
# => 1 
string.scan(/bb/).length 
# => 2 
string.scan(/ff/).length 
# => 0 
+0

मैं देखता हूं, वास्तविक तारों की गिनती खोजने के लिए, आप गिनती विधि के बजाय स्कैन विधि का उपयोग करते हैं। धन्यवाद। – Johnson

+1

हाँ ['स्कैन'] (http://www.ruby-doc.org/core-2.1.2/String.html#method-i-scan) नियमित रूप से अभिव्यक्ति लेता है जैसे'/aa/'या यहां तक ​​कि एक स्ट्रिंग जैसे कि आप "ए" "पसंद करते हैं और यदि आप मैच पसंद करते हैं और लौटाते हैं। 'लम्बाई' आपको बताती है कि अगर आप परवाह नहीं है कि मैच क्या हैं तो कितने मैच मिलते हैं। – tadman

+0

आप लंबाई – Johnson

संबंधित मुद्दे