Chris Hulan
2/15/2008 6:20:00 PM
On Feb 15, 10:18 am, Erwin <yves_duf...@mac.com> wrote:
> As per Ruby CookBook, I learnt how to sort a simple array by
> frequency :
>
> def sort_by_frequency_descending
> histogram = inject(Hash.new(0)) { |hash, x| hash[x] += 1; hash}
> sort_by { |x| [histogram[x] * -1, x]}
> end
> [1,2,3,4,1,2,4,8,1,4,9,16].sort_by_frequency_descending
> # => [1, 1, 1, 4, 4, 4, 2, 2, 3, 8, 9, 16]
>
> Q1: how should I modify this method, to manipulate more complex
> array,
> like [ [1, 1, a] ,[2 , 2, b] ,[ 3, 4, c] , [ 4, 5, d] , [1, 2, e] ,
> [ 2, 1, f] , [.....
> where I should sort on the first and second value of each element
>
> this sort_by_frequency_descending is a prelude comparing sucessive
> items of the array, once it is sorted :
>
> b_start = [ [1.0, 1.5, a1] , [1.0, 1.5, a2], [1.0, 1.5, a3], [1.0,
> 1.5, a4], [2.1, 2.5, a5], [2.1, 2.5, a6], [2.1, 2.5, a7], [4.6, 4.2,
> a8], [4.6, 4.2, a9], [4.6, 4.2, a10], [8.3, 8.4, a11], [8.3, 8.4,
> a12], [9.5, 9.3, a13], [16.8, 16.7, a14] ]
>
> when an item has first & second values identical to first & second
> values of previous item, then a proc should be applied to both values
> of second item to modify them ( * by random)
> b_start[i+1][0] == b_start[i][0] && _start[i+1][1] == b_start[i][1]
>
> Q2: I am not yet fluent with this kind of complex process (beyond my
> present readin status of ruby cookbook...)...
> I'll appreciate any help
For Q1 try:
array_of_arrays.sort_by{|a,b|
if a[0] == b[0]
a[1] <=> b[1]
else
a[0] <=> b[0]
end
}
For Q2, i'll assume you want a new array with the changes (if any):
new_arr_of_arrs = [array_of_arrays[0]] #first item is unchanged as no
previous to compare to
1.upto(array_of_arrays.size) { |i|
p = i-1
if array_of_arrays[p][0] == array_of_arrays[i][0] and
array_of_arrays[p][1] == array_of_arrays[i][1]
new_arr_of_arrs << some_func_retuning
randomized_arr_based_on(array_of_arrays[i])
else
new_arr_of_arrs << array_of_arrays[i]
end
}
I didn't run this code so it may have syntax errors (I think the logic
is good), but hopefully it gets you going
Cheers