[help] sorting & comparing complex array

E

Erwin

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[0] && _start[i+1][1] == b_start[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
 
C

Chris Hulan

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[0] && _start[i+1][1] == b_start[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[0] and
array_of_arrays[p][1] == array_of_arrays[1]
new_arr_of_arrs << some_func_retuning
randomized_arr_based_on(array_of_arrays)
else
new_arr_of_arrs << array_of_arrays
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,982
Messages
2,570,189
Members
46,734
Latest member
manin

Latest Threads

Top