2013-04-10 76 views
0

下面的代码获取一些文本,找到逗号,并返回一个没有逗号的分割版本的数组。重构难看的红宝石代码

class A 
    def separate_comma_values(text) 
    txt_len = text.length 
    if txt_len == 0 
     return [""] 
    end 
    final = [] 
    sub_arry = "" 

    for i in (0...txt_len) 
     ch = text[i] 
     if ch == "," 
     final << sub_arry 
     final << "" 
     sub = "" 
     else 
     sub_arry += ch 
     end 
    end 
    return final 
    end 
end 

这是一个示例输入和输出:

s = A.new 
print s.separate_comma_values("dh,,,dhhd,jhb") 
# => ["dh", "", "dh", "", "dh", "", "dhdhhd", ""] 

虽然它做什么,我想要它做的,我觉得有一些东西只是不正确了。这只是肮脏。

我知道我可以使用由ruby提供的内置方法来实现分割。

编辑:我想这是编辑出我原来的帖子。这背后的动机是应用我阅读红宝书后发现的知识。

+0

你可以通过固定错位的空白,其中有人只是为你所做的开始。也不要缩写变量名称。 – 2013-04-10 04:54:43

回答

0

重构代码的唯一正确方法显然是使用String#split

虽然,只是为了好玩:

def separate_comma_values(text) 
    text.each_char.reduce(['']) do |splitted, char|  
    if char == ',' 
     splitted << '' 
    else 
     splitted.last << char 
    end  
    next splitted  
    end  
end 
+0

这看起来比我原来的实施更清洁。 – tawheed 2013-04-11 02:56:52

1

Ruby中有一个方法可以做你想做的事。

http://ruby-doc.org/core-2.0/String.html#method-i-split

2.0.0p0 :001 > "dh,,,dhhd,jhb".split(',') 
=> ["dh", "", "", "dhhd", "jhb"] 

所以,你的代码可能最终会被那样简单

def separate_comma_values(text) 
    text.split(',') 
end 

更新:抱歉,我没在那里你提到你已经知道split的部分。哎呀。

+0

如果OP的输出真的是他想要的,那么'split'并不是他想要的东西。 – 2013-04-10 05:04:07

0

这是一个小小的清洁,虽然@depa指出,如果您尝试基于逗号分割,有一个更简单的方法,并且您的(因此这个)代码无法正常工作。

class A 
    def separate_comma_values(text) 
    return [""] if text.empty? 

    final = [] 
    sub_arry = "" 

    text.each_char do |ch| 
     if ch == "," 
     final << sub_arry 
     final << "" 
     else 
     sub_arry += ch 
     end 
    end 

    return final 
    end 
end 

s = A.new 
print s.separate_comma_values("dh,,,dhhd,jhb") 
puts 

此输出

["dh", "", "dh", "", "dh", "", "dhdhhd", ""] 

,就像你一样。

这是我将如何实现你的算法:

class A 
    def separate_comma_values(text) 
    return [""] if text.empty? 

    array = [] 
    value = "" 

    text.each_char do |c| 
     if c == "," 
     array << value 
     value = "" 
     else 
     value += c 
     end 
    end 

    array << value if !value.empty? 

    array 
    end 
end 

s = A.new 
print s.separate_comma_values("dh,,,dhhd,jhb") 
puts 

此输出

["dh", "", "", "dhhd", "jhb"] 
+0

您的输出与OP的扩展输出不匹配。 – 2013-04-10 06:10:35

+0

@RubyLovely,第一个版本是一样的,第二个版本是正确的。 – 2013-04-10 06:20:55

+0

好的!基本上OP想要,''''无论何时',,'都会被发现。我对吗? – 2013-04-10 06:41:04

0

就像一个小窍门为寻找更好的(在我看来),你应该能够跳字'return',而'seperate_comma_values(text)'可能只是'seperate_comma_values text'而没有parens(在你的文本编辑器中,语法颜色突出显示使得这完全没有问题)