使用SORT_BY将数组分为4组

时间:2019-06-20 13:54:24

标签: ruby

我有一个2D数组,我需要使用sort_by对这些数组中的值进行排序! (例如,当数组的第二个值为nil时,它属于第一组)

每种方法都可以做到这一点,但是我需要一个更漂亮/可读的代码。

到目前为止我所拥有的: arry pattern:[[164,nil,6],[163,nil,6],[162,nil,6],[161,nil,7],[160,“ FSDL”,6]]

floor(n/2)

我想做这样的事情:

matches.sort_by! {|匹配| (match.second == nil && match.last == 6)(second_condition)(third_condition)(fourth_condition)}

2 个答案:

答案 0 :(得分:0)

我用零?而不是空白?如果您想使用空白?现在?根据您的要求。可以按照以下步骤进行排序

matches.sort_by do |match|
    if(match[1].nil? && match.last == 6)
        "1 #{match.first}"
    elsif(not match[1].nil? && match.last == 6)
        "2 #{match.first}"
    elsif(match.last == 4)
        "3 #{match.first}"
    elsif(match.last == 7)
        "4 #{match.first}"
    else
        "5 #{match.first}"
    end
end

使用上面的代码,如果条件不匹配,将附加到最后

对于给定的样本,它将产生以下输出

[[162, nil, 6], [163, nil, 6], [164, nil, 6], [160, "FSDL", 6], [161, nil, 7]]

答案 1 :(得分:0)

不能完全清除预期的输出,但是如果返回预期的输出,我将添加一个解释。

matches = [[164, nil, 6], [163, nil, 6], [162, nil, 6], [161, nil, 7], [160, "FSDL", 6] ]

matches.group_by(&:last).tap { |h| h[6] = h[6].group_by { |e| e[1].nil? } }
         .tap { |h| h.default = [] }
         .then { |h| h[6][true] + h[6][false] + h[4] + h[7] }
         .map(&:first)

#=> [164, 163, 162, 160, 161]