2013-12-12 2 views
0

у меня есть:Как подсчитать истинные значения, возвращаемые итерацией массива с условием?

def distance(str1, str2) 
    str1.chars.each_index do |index| 
    difference?(str1, str2, index) 
    end 
end 

def difference?(str1, str2, index) 
    if !str1.chars[index].nil? && !str2.chars[index].nil? 
    str1.chars[index] != str2.chars[index] 
    end 
end 

Для каждого элемента в str1.chars, которые отличаются от элементов в str2.chars с теми же index, difference? возвращается true.

Как я могу подсчитать, сколько раз он возвращал true в distance?

я использовал что-то вроде этого:

def distance(str1, str2) 
    distance = 0 
    str1.chars.each_index do |index| 
    if difference?(str1, str2, index) 
     distance += 1 
    end 
    end 
    distance 
end 

Есть ли лучший способ сделать это? Может быть, count с блоком - это ответ, но я не могу понять это.

ответ

1
def distance(str1, str2) 
    str1.each_char.with_index.count do |_, index| 
    difference?(str1, str2, index) 
    end 
end 

distance("foo", "bar") # => 3 
distance("foo", "foobar") # => 0 
distance("foobar", "foo") # => 0 
+0

Мне нравится это решение, но можете ли вы объяснить, почему существует '_' внутри' | _, index | '? – narspeth

0

Это известно как Levenshtein Distance. Там в драгоценный камень для этого:

require 'levenshtein' 
Levenshtein.distance("abc","abd") #=> 1 

Драгоценный камень, вероятно, будет быстрее, чем другие решения, поскольку она использует собственные расширения.

Смежные вопросы