2014-12-31 284 views
1

我试图把字符串“xxxyyyzzz”并将其分成一个数组,将相同的字母组合在一起。所以我想输出为[“xxx”,“yyy”,“zzz”]。我不确定为什么这段代码不断循环。有什么建议么?这个循环为什么不停止?

def split_up(str) 
    i = 1 
    result = [] 
    array = str.split("") 
    until array == [] 
    if array[i] == array[i-1] 
     i += 1 
    else 
     result << array.shift(i).join("") 
    end 
    i = 1 
    end 
    result 
end 

puts split_up("xxxyyyzzz") 
+1

我不确定'循环结束时'i = 1'是你真正想要的。 –

+1

你不需要'加入' –

+1

你需要'i'才能继续执行你的程序,但是在循环的每一次迭代结束时,你都有'i = 1'。 – meagar

回答

5

循环是因为您的until条件永远不会退出。当连续字符匹配时,您正在递增i,但在循环结束时,您将i重置为1

如果编辑本段并添加此行:

until array == [] 
    puts i # new line 

然后你会看到i总是1,并且代码保持打印1永远。

删除行i = 1行,你会得到你想要的结果。

此外,您可能有兴趣阅读有关Ruby字符串scan方法,模式匹配和捕获组,以及使用先行和后置零长度断言(可以匹配边界)。

这里是我会亲自完成拆分在字母边界的字符串:

"xxxyyyzzz".scan(/(.)(\1*)/).map{|a,b| a+b } 
=> ["xxx", "yyy", "zzz"] 

scan方法是这样做的:

  1. .匹配任何字符如“x”,圆括号表示这一点。
  2. \1*与先前捕获的任何时间(例如, “xx”,括号表示这一点。
  3. 因此$ 1匹配第一个字符“x”,$ 2匹配所有重复“xx”。

扫描块连接第一个字符及其重复,因此返回“xxx”。

0

如上所述,这可以通过使用扫描这样解决:

def split_up(string) 
    repeat_alphabets = /(\w)(\1*)/ 
    string.scan(repeat_alphabets).map do |match| 
    match[0] << match[1] 
    end 
end 

说明:

  1. 的正则表达式匹配重复字符,但由于该正则表达式matches occur as pairs of the alphabet and remaining repeated instances的构造。
  2. m[0] << m[1]连接匹配以形成所需的字符串。
  3. map将字符串合并到一个数组中,并返回该数组作为最后一条语句。