按2个条件对数组数组进行排序

时间:2017-09-28 19:53:36

标签: arrays ruby sorting

我必须对此进行排序

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

2 个答案:

答案 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&的数组开头添加了0sort_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-10的值。基于此,值按顺序排列。

  • 1:a&gt; B'/ LI>
  • -1:a&lt; B'/ LI>
  • 0:a = b