2017-03-01 113 views
-2

我想查找保存順序的字符串的所有組合。有沒有在Ruby中內置的方法來實現這一目標?保存順序的Ruby字符串/數組組合保留順序

例如,"abcd".all_combinations應該給輸出:

a 
b 
c 
d 
ab 
bc 
cd 
abc 
bcd 
abcd 
+0

它是否必須是內置方法? –

+0

任何類型的實現都可以工作。但希望有一些類似object.combination的方法 – maddy

+0

看看http://apidock.com/ruby/Array/combination –

回答

3

可能不是理想的實現,但這個工程:

def combinations(str) 
    items = str.chars 
    (1..items.length).map { |i| items.each_cons(i).map(&:join) }.flatten 
end 

還要檢查Enumerable#each_cons。你也可以將它添加到String類是這樣的:

class String 
    def combinations 
    items = self.chars 
    (1..items.length).map { |i| items.each_cons(i).map(&:join) }.flatten 
    end 
end 

'abcd'.combinations 

正在發生的事情:

  • 我們做字符串中的字符的實際陣列String#chars
  • 然後,對於1之間的每個數i到字符串的長度:
    • 呼叫Enumerable#each_cons基本上返回長度i的可能組合作爲字符數組太。因此,如果i是2,則items.each_cons(2)結果將是[ ['a', 'b'], ['b', 'c'], ['c', 'd'] ]
    • .map(&:join)部分基本上是調用每個陣列的該陣列的元件的Array#join,所以它成爲['ab', 'bc', 'cd']
  • (1..items.length).map { |i| items.each_cons(i).map(&:join) }結果:[ ['a', 'b', 'c', 'd'], ['ab', 'bc', 'cd'], ['abc', 'bcd'], ['abcd'] ]這是一個數組數組。我們把它叫做Array#flatten,使它成爲一個簡單的數組(更多地閱讀flatten鏈接)。
+0

這工作,非常感謝!我是Ruby的新手......你能向我們解釋一下實施嗎? – maddy

+0

@maddy更新,希望有所幫助。您需要閱讀鏈接方法的描述以更好地瞭解發生的事情。 –

+0

@TamerShlash:您可以使用'Array#combination'代替'Enumberable#each_cons'也可以使用 –

1

沒有內建函數完全符合您的要求。

String#each_cons看起來很有趣,因爲Tamer指出。

下面是一個替代的解決方案:

def all_combos(str) 
    1.upto(str.length) do |segment_length| 
    0.upto(str.length - segment_length) do |starting_point| 
     puts str[starting_point, segment_length] 
    end 
    end 
end 

all_combos("abcd") 
+1

非常乾淨的解決方案。雖然我會讓每個子字符串「產生」而不是打印它,所以你可以通過'all_combos('abcd'){| s |放入s}'。 – Stefan

1

起始和子串的結尾索引形成具有重複一個組合,爲此,紅寶石確實有一個內置的方法的圖案。

class String 
    def all_combinations 
    idx = (0 ... self.size).to_a 
    idx.repeated_combination(2){|i,j| yield self[i..j]} 
    end 
end 

"abcd".all_combinations{|combo| puts combo} 
+0

'each_combination'可能是一個更好的名字。 – Stefan