对中间最小值的哈希数组进行排序



我是Ruby的新手,没有找到任何关于如何做到这一点的答案或逻辑。我试图将数组分成两半,其中一半按降序排序,另一半按升序排序。

长话短说,让我们考虑我们有以下哈希数组:

[
{:rating=>1, :num=>1},
{:rating=>1, :num=>1},
{:rating=>3.5, :num=>37},
{:rating=>4.0, :num=>23},
{:rating=>4.0, :num=>72},
{:rating=>4.0, :num=>38}, 
{:rating=>3.5, :num=>72}, 
{:rating=>4.0, :num=>74}
]

我不太擅长解释事情,但我会尽力更好地解释预期的结果。

首先,我需要获取具有最小:rating键值和:num键值的哈希值,并将其推送到新数组中。剩余的哈希值应在:rating:num之后对 asc 进行排序,然后,每个哈希值(从具有最小:rating值的哈希开始(应按照以下规则在新创建的数组中推送:一个在数组的开头,一个在数组的末尾,直到没有哈希。

所以最终结果应该是这样的:

[
{:rating=>4.0, :num=>74},
{:rating=>4.0, :num=>72},
{:rating=>3.5, :num=>72},
{:rating=>1, :num=>1},
{:rating=>1, :num=>1},
{:rating=>3.5, :num=>37},
{:rating=>4.0, :num=>23},
{:rating=>4.0, :num=>38}
]

任何帮助都非常感谢。谢谢。

也许有点复杂的解决方案,但它有效。请看一下,我会尝试重构它

initial_array = [
{:rating=>1, :num=>1},
{:rating=>1, :num=>1},
{:rating=>3.5, :num=>37},
{:rating=>4.0, :num=>23},
{:rating=>4.0, :num=>72},
{:rating=>4.0, :num=>38},
{:rating=>3.5, :num=>72},
{:rating=>4.0, :num=>74}
]

length = initial_array.length
new_array = []
length.times do |i|
is_odd = i % 2 == 1
min_index = initial_array.map{|el| el[:rating]}.each_with_index.min.last
if is_odd
new_array.push(initial_array.delete_at(min_index))
else
new_array.unshift(initial_array.delete_at(min_index))
end
end
p new_array

主要思想是每次从数组中查找最小元素,并将其从右推一次,从左推一次到新数组。

最小值由评级(map{|el| el[:rating]}(找到,但是您可以实现一些更复杂的功能,这些函数将同时利用ratingnum,具体取决于您的业务逻辑。

对于"将数组分成两半",我能想到的唯一与您想要的结果一致的解释是,要按升序排序的哈希是那些h[:num]小于数组中h所有哈希值h[:num]平均值h的哈希, 并且其余的哈希值将按升序排序。

假设此解释是正确的,并让变量arr保存您的数组,则可以按如下方式获得所需的排序数组。

avg = arr.sum { |h| h[:num] }.fdiv(arr.size)
#=> 39.75
arr.sort_by { |h| h[:num] < avg ? [h[:rating], h[:num]] : [-h[:rating], -h[:num]] }
#=> [{:rating=>4.0, :num=>74},
#    {:rating=>4.0, :num=>72},
#    {:rating=>3.5, :num=>72},
#    {:rating=>1,   :num=> 1},
#    {:rating=>1,   :num=> 1},
#    {:rating=>3.5, :num=>37},
#    {:rating=>4.0, :num=>23},
#    {:rating=>4.0, :num=>38}] 

最新更新