2014-09-01 66 views
6

我想要制作一个Ruby程序来计算两个字母一起出现的次数。这是写我读的文件中:计算两个字母一起出现的次数

hola 
chau 

而这正是我试图让:

ho;ol;la;ch;ha;au; 
1;1;1;1;1;1; 

我不能让它正常工作。这是到目前为止我的代码:

file = File.read(gets.chomp) 
todo = file.scan(/[a-z][a-z]/).each_with_object(Hash.new(0)) { 
    |a, b| b[a] += 1 
} 

keys = '' 
values = '' 

todo.each_key { 
    |key| keys += key + ';' 
} 
todo.each_value { 
    |value| values += value.to_s + ';' 
} 

puts keys 
puts values 

这是我得到的结果:

ho;la;ch;au; 
1;1;1;1; 

为什么我没有得到角色的每个组合?我应该给我的正则表达式添加什么,以便计算每个字符组合?

回答

9

由于字符重叠,所以您需要使用前视来捕获重叠的字符。

(?=([a-z][a-z])) 

DEMO

+1

非常具有启发性,Avinash。我以前没有在lookaround组中看过捕获组。很强大。 – 2014-09-01 16:14:03

+0

你可以使用积极的后顾之谈'(?<=([a-z] [a-z]))',你在你删除的评论中暗示了这一点。我认为这值得一提。 – 2014-09-01 18:59:00

2

这是一种方式。

def char_pairs(str) 
    str.split(/\s+/).flat_map { |w| w.chars.each_cons(2).map(&:join) } 
        .each_with_object({}) { |e,h| h[e] = (h[e] ||= 0) + 1 } 
end 

char_pairs("hello jello") 
    #=> {"he"=>1, "el"=>2, "ll"=>2, "lo"=>2, "je"=>1} 

char_pairs("hello yellow jello") 
    #=> {"he"=>1, "el"=>3, "ll"=>3, "lo"=>3, "ye"=>1, "ow"=>1, "je"=>1} 

有散列,将它转换为任何你想要的输出格式是一件容易的事情。

相关问题