Ruby 为什么在使用/W拆分字符串时会生成空格
我正试着把一根绳子劈开,以便弄清楚上面的字 我的代码如下:Ruby 为什么在使用/W拆分字符串时会生成空格,ruby,Ruby,我正试着把一根绳子劈开,以便弄清楚上面的字 我的代码如下: def words(string) string.downcase! hash_str = Hash.new string.split(/\W/i).each {|y| if(hash_str.has_key?(y)) hash_str[y] += 1 else hash_str[y] =1 end } return h
def words(string)
string.downcase!
hash_str = Hash.new
string.split(/\W/i).each {|y|
if(hash_str.has_key?(y))
hash_str[y] += 1
else
hash_str[y] =1
end
}
return hash_str
end
hash_t = words("A man, a plan, a canal -- Panama")
hash_t.each{|x,y| puts "#{x}:#{y}"}
输出为:
1 :5
2 a:3
3 plan:1
4 man:1
5 canal:1
6 panama:1
我的问题是,似乎空白也被计算在内。
如何添加空白
谢谢。当两个或多个非单词字符相邻时,将出现空白字符串条目 因此,
“一个人,一个”
在空格处分开,得到“一个”
和“一个人,一个”
;然后在逗号处给出“man”和“a”,然后在空格处再次给出“man”和“a”
如果使用split(/\W+/i)
,您将得到预期的结果,因为它将把每个非单词字符字符串视为一个单独的拆分
空白字符串条目出现在两个或多个非单词字符相邻的地方 因此,
“一个人,一个”
在空格处分开,得到“一个”
和“一个人,一个”
;然后在逗号处给出“man”和“a”,然后在空格处再次给出“man”和“a”
如果使用split(/\W+/i)
,您将得到预期的结果,因为它将把每个非单词字符字符串视为一个单独的拆分
一种更具红宝石色彩的解决方案:
str = "A man, a plan, a canal -- Panama"
str.downcase.split(/\W+/).inject(Hash.new(0)) { |h,v| h[v] += 1; h }
=> {"plan"=>1, "a"=>3, "panama"=>1, "man"=>1, "canal"=>1}
更具红宝石风格的解决方案:
str = "A man, a plan, a canal -- Panama"
str.downcase.split(/\W+/).inject(Hash.new(0)) { |h,v| h[v] += 1; h }
=> {"plan"=>1, "a"=>3, "panama"=>1, "man"=>1, "canal"=>1}
在这种情况下,使用
scan
在概念上更为自然。此用例的典型实现如下所示:
def words(string)
Hash.new(0).tap{|h| string.downcase.scan(/\w+/){|w| h[w] += 1}}
end
words("A man, a plan, a canal -- Panama").each{|x,y| puts "#{x}:#{y}"}
这将使:
a:3
man:1
plan:1
canal:1
panama:1
在这种情况下,使用
scan
在概念上更为自然。此用例的典型实现如下所示:
def words(string)
Hash.new(0).tap{|h| string.downcase.scan(/\w+/){|w| h[w] += 1}}
end
words("A man, a plan, a canal -- Panama").each{|x,y| puts "#{x}:#{y}"}
这将使:
a:3
man:1
plan:1
canal:1
panama:1
也许你可以尝试使用
split(/\b/)
对我有用<代码>散列是{“a”=>3,“man”=>1,“plan”=>1,“canal”=>1,“panama”=>1}
。你在用什么Ruby?我在用这个->哦,我以为你在抱怨a:3
之前的空格。我只是不知道为什么会有:5可能你可以尝试使用split(/\b/)
对我有效<代码>散列是{“a”=>3,“man”=>1,“plan”=>1,“canal”=>1,“panama”=>1}
。你在用什么Ruby?我在用这个->哦,我以为你在抱怨a:3
之前的空格。这是缺席。我只是不知道为什么有:5哦。。。我从来没想过“”也算在内。谢谢。哦。。。我从来没想过“”也算在内。谢谢,这是一个干净的密码。。我想我还不习惯Ruby.:)谢谢:)@newbie不客气。请注意,您可以跳过代码中的has_key?
业务,因为您可以使用new
构造函数创建默认值为0的哈希。new(0)
@newbieinject
(方法链中的最后一个方法)始终返回其处理的最后一个值,这是本例中的散列(h
)实际上我不理解你的代码。。。它是如何确定h是hashmap,v是值的??。。。那为什么最后会有一个h?请解释一下。谢谢。请参阅inject
的文档。你用一个初始值调用它,在本例中是散列,然后它用这个初始值和我们刚刚拆分的数组中的对象调用你的块。对于每个循环,您必须将希望在下一轮中使用的memo
对象返回给它。这是结尾的h
。这是一个干净的代码。。我想我还不习惯Ruby.:)谢谢:)@newbie不客气。请注意,您可以跳过代码中的has_key?
业务,因为您可以使用new
构造函数创建默认值为0的哈希。new(0)
@newbieinject
(方法链中的最后一个方法)始终返回其处理的最后一个值,这是本例中的散列(h
)实际上我不理解你的代码。。。它是如何确定h是hashmap,v是值的??。。。那为什么最后会有一个h?请解释一下。谢谢。请参阅inject
的文档。你用一个初始值调用它,在本例中是散列,然后它用这个初始值和我们刚刚拆分的数组中的对象调用你的块。对于每个循环,您必须将希望在下一轮中使用的memo
对象返回给它。这就是结尾的h
。