Techioz Blog

変数に間違った数が割り当てられるのはなぜですか?

概要

最大数を変数に保存しようとしています。

配列をループすると正しいカウントが表示されますが、カウントの高い変数への割り当ては、配列内でチェックされた最後の項目のカウントであるようです。

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 に似ていますが、比較する値を取得するために詳細を調べる必要がある複雑なオブジェクトを操作する場合に、より便利で高速です。

やる事: