2010-12-04 5 views
2

バリエーションを計算するRubyで書かれたメソッドが必要です。私は既にJavaで書いていますが、私がRubyを初めて使っているときには、Rubyの実装について私が見逃していることがあります。Rubyバグを繰り返すバリエーション

方法は、これを行うためにsuposedれる:
方法(1、 "01")=> [ "0"、 "1"]
方法(2、 "01")=> [ "00"、 "01"、 "10"、 "11"] ...あなたは考えを得る。

ノート:(、[ "0"、1" ] 2)の方法が、それは問題ではないのです

私のJavaのimpl:RubyのIMPLに、私はこのようなparalmsを与える。

public static List<String> Variations(int strength, String usableChars) { 
    List<String> list = 
     new ArrayList<String>((int) Math.pow(usableChars.length(), strength)); 

    if (strength == 0) { 
     list.add(""); 
    } else { 
     List<String> l = Variations(strength - 1, usableChars); 
     for (char c : usableChars.toCharArray()) { 
      for (String s : l) { 
       list.add(c + s); 
      } 
     } 
    } 
    return list; 
} 

そして、それは正常に動作しています。しかし、これは私のRubyの実装です:。この中

def Variation (strength, arrayOfString) 
    array = Array.new(arrayOfString.size**strength) 

    if strength == 0 
     array << "" 
    else 
     a = Variation(strength-1, arrayOfString) 
     for i in arrayOfString do 
      for j in a do 
       array << (i + j) 
      end 
     end 
    end 
    return array 
end 

を私はエラーメッセージtest.rbを得続ける:10: `変化"に:文字列(TypeError例外)にnilを変換することはできません。

答えて

2

Rubyでは、必要に応じて自動的に配列が拡大します。

arrayOfString.each_char do |i| 

:これを行う

for i in arrayOfString do 

するのではなく、文字列の各文字の上に列挙するに

array = Array.new(arrayOfString.size**strength) 

array = [] 

へ:だからからあなたの配列の初期化を変更最終結果:

#!/usr/bin/ruby1.8 

def Variation (strength, arrayOfString) 
    array = [] 
    if strength == 0 
    array << "" 
    else 
    a = Variation(strength - 1, arrayOfString) 
    arrayOfString.each_char do |i| 
     for j in a do 
     array << (i + j) 
     end 
    end 
    end 
    return array 
end 

p Variation(2, '01') # => ["00", "01", "10", "11"] 

each_charは、Ruby> = 1.8.7であるか、backports gemからそれを得ることができます。

+0

ありがとうございます。私は意図的に配列のサイズを宣言しました。新しい要素を追加するたびにサイズを増やさないようにしました(Javaではサイズを宣言する必要はありません)。 Rubyでこれを行うにはいくつかの方法がありますか? –

+0

私が思い出したように、Rubyは配列メモリをチャンクに再割り当てするので、展開するたびに再割り当てする必要はありません。しかし、 'size' nilsの配列を割り当てるには、' [nil] * size'がそれを行います。 –

+0

@ user245543、私はソース(array.c)に戻りました。私の記憶は正しい。 Rubyは、16個の要素のための十分な空き領域を持つ配列を作成し、必要に応じてそれを塊として作成します(誤っていなければ、配列内の要素が増えるほど、メモリが追加されます)。配列の割り当てに使用される時間はほとんど問題ではありません。 –

関連する問題