2008/1/7, Bil Kleb <Bil.Kleb / nasa.gov>:
> Hi,
>
> I'm looking for an elegant way to do the following:
>
>   Given an sorted array of (X,Y) pairs where Y is strictly
>   increasing, i.e., no repeated Ys.
>
>   Compact pairs with repeated Xs, keeping the pair with
>   the highest Y value.
>
> E.g.,
>
>   require 'test/unit'
>
>   class TestConsolidation < Test::Unit::TestCase
>     def test_should_remove_repeated_Xs_but_save_one_with_highest_Y
>       initial = [ [ 1, 12 ], [ 3, 15 ], [ 3, 17 ], [ 3, 22 ], [ 7, 45 ] ]
>       desired = [ [ 1, 12 ], [ 3, 22 ], [ 7, 45 ] ]
>       assert_equal desired, initial.consolidate
>     end
>   end
>
>   class Array
>     def consolidate
>       # Too embarrassed to show current hack.
>     end
>   end
>
> My least surprise inclination had me researching #uniq and #compact
> to see if they took a block like #sort.

This is easy with #inject:

ar.inject([]) do |res, (x,y)|
  if res.empty? || res.last[0] != x
    res << [x,y]
  else
    res.last[1] = y
  end
  res
end

Cheers

robert

-- 
use.inject do |as, often| as.you_can - without end