変数に間違った数が割り当てられるのはなぜですか?
概要
最大数を変数に保存しようとしています。
配列をループすると正しいカウントが表示されますが、カウントの高い変数への割り当ては、配列内でチェックされた最後の項目のカウントであるようです。
def calculate_word_frequency(content, line_number)
looper = 0
wordCounter = ""
#CREATE AN ARRAY FROM EACH LINE
myArray = content.split
#LOOP THROUGH ARRAY COUNTING INSTANCES OF WORDS
while looper < myArray.length
p myArray[looper]
wordCounter = myArray[looper]
puts myArray.count(wordCounter)
if highest_wf_count < myArray.count
highest_wf_count = myArray.count
end
looper +=1
end
puts highest_wf_count
end
解決策
何かの頻度を数えて最大値を取得する方法は、Stack Overflow にすべてあります。
私なら次のようにします:
def word_frequency(content)
content
.split
.each_with_object(
Hash.new { |h, k| h[k] = 0 }
) { |w, h|
h[w] += 1
}
end
def max_frequency(content)
word_frequency(content)
.max_by{ |k, v| v }
end
word_frequency('a') # => {"a"=>1}
word_frequency('a b') # => {"a"=>1, "b"=>1}
word_frequency('a b a') # => {"a"=>2, "b"=>1}
word_frequency('a b a c a b') # => {"a"=>3, "b"=>2, "c"=>1}
max_frequency('a b a c a b') # => ["a", 3]
私は空白部分でのみ分割する基本的な分割を使用しています。
'a b'.split # => ["a", "b"]
'a. b'.split # => ["a.", "b"]
これは非常に単純で、実際の単語ではなく、空白の区切りのみを返します。 SO の結果を改善する方法については多くの質問があります。
each_with_object は inject に似ていますが、より便利です。それはあなたの友達になります。
max_by は max に似ていますが、比較する値を取得するために詳細を調べる必要がある複雑なオブジェクトを操作する場合に、より便利で高速です。
やる事: