我必须对此进行排序
ary = [[5, "e", "2"], [2, "r", "="], [2, "y", "2"], [2, "h", "="]]
获得:
# => [[5, "e", "2"], [2, "y", "2"], [2, "h", "="], [2, "r", "="]]
如果最后一个元素(索引2)等于“=”,则它必须在具有相同第一个元素的数组之后,即使该字母在之前。 像这样:
ary.each_with_index do |array, index|
if ary[index][2] == "=" && ary[index][0] == ary[index +1][2]
a = ary[index]
b = ary[index +1]
ary[index] = b
ary[index+1] = a
end
end
答案 0 :(得分:2)
我假设,对于以"="
结尾的元素,排序是通过减少第一个元素的值(整数)和有关系时,通过增加第二个元素(字符串)的顺序。此外,我假设对于不以"="
结尾的元素的排序是相同的,除非前两个元素都绑定,排序是通过增加最后一个元素(字符串)的顺序。
def sort_em(arr)
arr.sort_by { |n, s1, s2| [s2 == "=" ? 1 : 0, -n, s1, s2] }
end
sort_em [[5, "e", "2"], [2, "r", "="], [2, "y", "2"], [2, "h", "="]]
#=> [[5, "e", "2"], [2, "y", "2"], [2, "h", "="], [2, "r", "="]]
请参阅Array#<=>文档的第三段,了解排序时数组的排序方式。
为了确保以"="
结尾的元素排在最后,我只是在1
&的数组开头添加了0
(sort_by
)& #39;用"="
结束(未结束)数组的块。
答案 1 :(得分:1)
您可以使用sort并提供自己的排序块:
ary.sort do |a, b|
if a[2] == '=' && b[2] != '='
# a has '=' => a > b
1
elsif b[2] == '=' && a[2] != '='
# b has '=' => a < b
-1
else
# This is hit if neither a nor b have a '=' OR when both do.
# Use default comparison operator
# but restrict it to the second element of the array
a[1] <=> b[1]
end
end
该块需要返回1
,-1
或0
的值。基于此,值按顺序排列。