From: "Jesús Gabriel y Galán" Date: 2008-11-07T22:07:40+09:00 Subject: Re: Data output On Thu, Nov 6, 2008 at 6:23 PM, Stuart Clarke wrote: > I am processing data from an array which basically involves me searching > for specific information and outputting the results that match eg. > > ....... > if data == 100 > puts "#{data.time_written}" > > I have just inserted a step which adds some additional criteria. This > states if you find data that equals 100 does it happens more than 10 > times in one day. > > This all works fine. What i want is some kind of nested if statement > thats does the following: > > if data == 100 > if data happens more than 5 times in one day > print out the results of all the data that equals 100 but highlight > (colour code, italics etc)the data within the results that happens more > than 5 times in a day. > > An example of the results might be > > 100 monday - - - BOLD > 100 monday - - - BOLD > 100 monday - - - BOLD > 100 monday - - - BOLD > 100 monday - - - BOLD > 100 monday - - - BOLD > 100 tuesday - - - NORMAL This is how I'd do it: first build an histogram of the data. In this case you want to count how many there are of a combination of data and day. Then print the array checking against the histogram for choosing style: irb(main):001:0> TimeData = Struct.new :data, :day => TimeData irb(main):002:0> a = [] => [] irb(main):003:0> 6.times {a << TimeData.new(100, "monday")} => 6 irb(main):004:0> a << TimeData.new(100, "tuesday") => [#, #, #, #, #, #, #] irb(main):005:0> h = Hash.new(0) => {} irb(main):007:0> a.inject(h) {|histo,time| h[[time.data, time.day]] += 1} => 1 irb(main):008:0> h => {[100, "tuesday"]=>1, [100, "monday"]=>6} irb(main):009:0> a.each do |time| irb(main):010:1* if h[[time.data, time.day]] > 5 irb(main):011:2> puts "#{time.data} #{time.day}" irb(main):012:2> else irb(main):013:2* puts "#{time.data} #{time.day}" irb(main):014:2> end irb(main):015:1> end 100 monday 100 monday 100 monday 100 monday 100 monday 100 monday 100 tuesday Hope this helps. Jesus.