Forum: Ruby String comparisions and counting

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-11-05 15:37
I have an array full of strings which represent a date ID. The array
contains indivduals strings like the following:

TueAug052008

I want to iterate through this array (@eventbydate[]) and check each of
the values of the array. I then want a statement which says if any of
the date ID's in the array occurs more than 5 times print out some data.

Pseudo code

if dataID occurs more than 5times
   print results
end

I hope this makes sense.

I would appreciate any help

Regards
Todd B. (Guest)
on 2008-11-05 16:03
(Received via mailing list)
On Wed, Nov 5, 2008 at 7:35 AM, Stuart C.
<removed_email_address@domain.invalid> wrote:
>
> if dataID occurs more than 5times
>   print results
> end
>
> I hope this makes sense.
>
> I would appreciate any help
>
> Regards

[1, 1, 2, 3, 4].count(1)

Todd
Brian C. (Guest)
on 2008-11-05 16:18
Stuart C. wrote:
> I have an array full of strings which represent a date ID. The array
> contains indivduals strings like the following:
>
> TueAug052008
>
> I want to iterate through this array (@eventbydate[]) and check each of
> the values of the array. I then want a statement which says if any of
> the date ID's in the array occurs more than 5 times print out some data.

  counts = Hash.new(0)
  @eventbydate.each { |e| counts[e] += 1 }
  if counts.find { |c| c >= 5 }
    puts "Print out some data"
  end

There are other variations:

  ...
  if counts.values.max >= 5
  ...

More efficient is to stop counting as soon as you reach 5, if you don't
need the final values:

  counts = Hash.new(0)
  if @eventbydate.find { |e| (counts[e] += 1) >= 5 }
    puts "Print out some data"
  end
Brian C. (Guest)
on 2008-11-05 16:20
Oops:

>   if counts.find { |c| c >= 5 }

if counts.find { |k,v| c >= 5 }
Harry K. (Guest)
on 2008-11-05 16:20
(Received via mailing list)
On Wed, Nov 5, 2008 at 10:35 PM, Stuart C.
Harry K. (Guest)
on 2008-11-05 16:21
(Received via mailing list)
On Wed, Nov 5, 2008 at 10:35 PM, Stuart C.
<removed_email_address@domain.invalid> wrote:
>
> Posted via http://www.ruby-forum.com/.
>
>

Is this helpful?

arr = ["a","b","a","c","a","a","c"]

h = Hash.new(0)
arr.each {|x| h[x] += 1}
h.each {|x,y| p x if y > 3}

Harry
Todd B. (Guest)
on 2008-11-05 16:30
(Received via mailing list)
On Wed, Nov 5, 2008 at 8:18 AM, Brian C. <removed_email_address@domain.invalid>
wrote:
>  counts = Hash.new(0)
>
> More efficient is to stop counting as soon as you reach 5, if you don't
> need the final values:
>
>  counts = Hash.new(0)
>  if @eventbydate.find { |e| (counts[e] += 1) >= 5 }
>    puts "Print out some data"
>  end
> --

Pretty darn good.  Why not use a database?  I guess it comes down to
often you want to query the data.

Todd
Stuart C. (Guest)
on 2008-11-05 16:49
Great stuff thanks. I went the last solution as I only want to pick up
any any high occurances.

Many thanks

Brian C. wrote:
> Stuart C. wrote:
>> I have an array full of strings which represent a date ID. The array
>> contains indivduals strings like the following:
>>
>> TueAug052008
>>
>> I want to iterate through this array (@eventbydate[]) and check each of
>> the values of the array. I then want a statement which says if any of
>> the date ID's in the array occurs more than 5 times print out some data.
>
>   counts = Hash.new(0)
>   @eventbydate.each { |e| counts[e] += 1 }
>   if counts.find { |c| c >= 5 }
>     puts "Print out some data"
>   end
>
> There are other variations:
>
>   ...
>   if counts.values.max >= 5
>   ...
>
> More efficient is to stop counting as soon as you reach 5, if you don't
> need the final values:
>
>   counts = Hash.new(0)
>   if @eventbydate.find { |e| (counts[e] += 1) >= 5 }
>     puts "Print out some data"
>   end
This topic is locked and can not be replied to.