Forum: Ruby Struggling with array searches/queries

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Stuart C. (Guest)
on 2008-12-16 01:39
I am reading delimited lines of data stored in array eg

123   name     address      date       product

I perform an array.each and then run an if statement based on the ID
(123). What I wish to do now is say

if you find ID 123
read the entries in name and count unique names

eg the entries bob bob mike sue
Would report 2      bob
             1      mike
             1      sue

I was thinking something like this

if id==123
  namelist.push name
  counts = Hash.new(0)
  if namelist.find {|n| (counts[n]) +=1}
    puts counts + name

Obviously the coding is not correct, but can anyone comment or expand
further on this?

Many thanks
Miles G. (Guest)
on 2008-12-16 03:37
(Received via mailing list)
I'd just map the names in a hash.  Something like

name_hash = {}

then in the loop/if statements:

name_hash[name] ||= 0
name_hash[name] +=1

when you want to print it out

name_hash.each_pair {|name,count| puts "#{key} occurs #{count} times"}

I don't really understand the logic of your code.  I'm not sure what
the find method does, but it looks like your code would increment the
count for everyname encountered so far if the ID is 123.

I think you're experiencing a problem with your algorithm, not your
code.  Your algorithm doesn't seem to make sense to me.

On Mon, Dec 15, 2008 at 3:31 PM, Stuart C.
Todd B. (Guest)
on 2008-12-16 04:29
(Received via mailing list)
On Mon, Dec 15, 2008 at 5:31 PM, Stuart C.
<removed_email_address@domain.invalid> wrote:
> eg the entries bob bob mike sue
>    puts counts + name
>
> Obviously the coding is not correct, but can anyone comment or expand
> further on this?

An approach...

a = %w(bob bob mike sue)
p a.inject(Hash.new(0)) {|h, n| h[n] += 1; h}
=> {"mike"=>1, "sue"=>1, "bob"=>2}

...or (in 1.8.7) a different one...

a = %w(bob bob mike sue)
p a.uniq.inject({}) {|h, i| h[i] = a.count(i); h}

Todd
This topic is locked and can not be replied to.