Java Ruby变异与重复bug方法

Java Ruby变异与重复bug方法,java,ruby,variations,Java,Ruby,Variations,我需要一个用Ruby编写的方法,它可以计算变化。我已经用Java编写了它,但由于我是Ruby新手,Ruby实现中缺少了一些东西 支持此方法: 方法(1,“01”)=>[“0”,“1”] 方法(2,“01”)=>[“00”,“01”,“10”,“11”]…这样你就明白了 注意:在Ruby impl中,我给出了如下参数:方法(2,[“0”,1“]),但这不是问题 我的Java impl: public static List<String> Variations(int strength

我需要一个用Ruby编写的方法,它可以计算变化。我已经用Java编写了它,但由于我是Ruby新手,Ruby实现中缺少了一些东西

支持此方法:
方法(1,“01”)=>[“0”,“1”]
方法(2,“01”)=>[“00”,“01”,“10”,“11”]…这样你就明白了

注意:在Ruby impl中,我给出了如下参数:方法(2,[“0”,1“]),但这不是问题

我的Java impl:

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;
}
公共静态列表变体(int-strength、字符串usableChars){
列表=
新的ArrayList((int)Math.pow(usableChars.length(),strength));
如果(强度==0){
列表。添加(“”);
}否则{
列表l=变化(强度-1,可用字符);
for(char c:usableChars.toCharArray()){
for(字符串s:l){
列表。添加(c+s);
}
}
}
退货清单;
}
工作正常。但这是我的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
def变化(强度、阵列管柱)
array=array.new(arrayOfString.size**strength)
如果强度==0

数组在Ruby中,数组会根据需要自动增长。因此,将您的数组初始化更改为:

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

枚举字符串中的每个字符,而不是

for i in arrayOfString do
这样做:

arrayOfString.each_char do |i|
最终结果是:

#!/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"]
!/usr/bin/ruby1.8
def变化(强度、阵列管柱)
数组=[]
如果强度==0

array=1.8.7,也可以从中获取。

谢谢,效果很好。我有意声明了数组的大小,以免每次添加新元素时都增加大小(在Java中,我也不需要声明大小).在Ruby中有什么方法可以做到这一点吗?如果我记得的话,Ruby会将数组内存分块重新分配,这样就不必在每次扩展时都重新分配。但是要分配一个
size
nils的数组,
[nil]*size
就可以了。@user245543,我回到了源代码(array.c);我的内存是正确的。Ruby创建的数组有足够的空间容纳16个元素,然后根据需要将其分块增长(如果我没有弄错的话,数组中的元素越多,添加的内存就越多)。分配数组所用的时间很少值得关注。
each_char
ruby 1.8.7+是否仅限于此?@Andrew Grimm,是的,或者来自Backport gem。答案已编辑。
#!/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"]