lundi 16 septembre 2019

Accessing a hash inside an array

I am working on a coding problem where I have 3 lines of text and I have to calculate the words that appear the most in those lines. The answer is: ['it','really','will'] because the text is:

This is a really really really cool experiment really Cute little experiment Will it work maybe it will work do you think it will it will

Everything works in the code below except the highest_count_words_across_lines method. It's supposed to return ['it','really','will'] but instead returns 2 hashes inside an array:[{"a"=>1, "cool"=>1, "experiment"=>1, "is"=>1, "really"=>4, "this"=>1}, {"cute"=>1, "experiment"=>1, "little"=>1}, {"do"=>1, "it"=>4, "maybe"=>1, "think"=>1, "will"=>4, "work"=>2, "you"=>1}].

I've tried iterating through a hash with multiple select statements to no avail.

This is my full code so far:

class LineAnalyzer
      attr_accessor :highest_wf_count, :highest_wf_words, :content, :line_number #Implement the following read-only attributes in the LineAnalyzer class. 

  def initialize(content, line)   
      @content = content   #* initialize the content and line_number attributes
      @line_number = line   
      @highest_wf_count = 0
      calculate_word_frequency()  
  end

  def calculate_word_frequency()
    @highest_wf_words = Hash.new
    words = @content.downcase.split
    words.each { |w|
      if @highest_wf_words.has_key?(w)
        @highest_wf_words[w] += 1
      else
        @highest_wf_words[w] = 1
      end
    }
    @highest_wf_words.sort_by { |word, count| count }
    @highest_wf_words.each do |key, value|
      if value > @highest_wf_count
        @highest_wf_count = value
      end
    end
  end

  def highest_wf_count= (number)
    @highest_wf_count = number
  end

end


class Solution
  attr_reader :analyzers, :highest_count_across_lines, :highest_count_words_across_lines # Implement the following read-only attributes in the Solution class.

  def initialize() 
    @analyzers = []
    highest_count_across_lines = nil
    highest_count_words_across_lines = []
  end

  def analyze_file()
    File.foreach('test.txt').with_index(1) do |content, line|
      line_analyzer = LineAnalyzer.new(content, line)
      @analyzers << line_analyzer
    end
  end

  def calculate_line_with_highest_frequency()

     @highest_count_across_lines = analyzers.map(&:highest_wf_count).max
     @highest_count_words_across_lines = analyzers.select { |k,v| v = @highest_count_across_lines }
  end


  def print_highest_word_frequency_across_lines() 
    "The following words have the highest frequency per line: \n  #{highest_count_words_across_lines} (appears in line #{line_num} \n"  
  end
end

This is the error message I get:

Failures:

  1) Solution#calculate_line_with_highest_frequency calculates highest count words across lines to be will, it, really
     Failure/Error: expect(words_found).to match_array ["will", "it", "really"]

       expected collection contained:  ["it", "really", "will"]
       actual collection contained:    [{"a"=>1, "cool"=>1, "experiment"=>1, "is"=>1, "really"=>4, "this"=>1}, {"cute"=>1, "experiment"=>1, "little"=>1}, {"do"=>1, "it"=>4, "maybe"=>1, "think"=>1, "will"=>4, "work"=>2, "you"=>1}]
       the missing elements were:      ["it", "really", "will"]
       the extra elements were:        [{"a"=>1, "cool"=>1, "experiment"=>1, "is"=>1, "really"=>4, "this"=>1}, {"cute"=>1, "experiment"=>1, "little"=>1}, {"do"=>1, "it"=>4, "maybe"=>1, "think"=>1, "will"=>4, "work"=>2, "you"=>1}]
     # ./spec/solution_spec.rb:39:in `block (3 levels) in <top (required)>'

Finished in 0.26418 seconds (files took 0.38 seconds to load)
19 examples, 1 failure

Failed examples:

rspec ./spec/solution_spec.rb:31 # Solution#calculate_line_with_highest_frequency calculates highest count words across lines to be will, it, really

I've tried iterating through the hashes within an array but kept getting an error message. I am trying to find the keys where the values (counts) are equal to the highest count (4). So the final answer should be ["it","really","will"]. Any suggestions?

Aucun commentaire:

Enregistrer un commentaire