在Ruby中部分排序数组

时间:2014-04-13 01:00:09

标签: ruby arrays sorting

我试图按字母顺序对数组排序,排除单词" Other",这是我想要在数组末尾的成员。让我们说该数组如下所示:

cities = [["Sidney"], ["Other"], ["Melbourne"]]

简单地说,cities.sort只需执行以下操作:

[["Melbourne"], ["Other"], ["Sidney"]]

我希望成员按字母顺序排列在最后["Other"],如下:

[["Melbourne"], ["Sidney"], ["Other"]]

有人能指出我在正确的方向吗?

2 个答案:

答案 0 :(得分:1)

cities = [["Sidney"], ["Other"], ["Melbourne"]]
cities.delete_if { |x| x.first == ("Other") } #remove other from the Array and then sort by the city
cities.sort_by { |x| x.first }.push(["Other"])
#=> [["Melbourne"], ["Sidney"], ["Other"]]

答案 1 :(得分:1)

cities.sort_by do |(city)|
  [city == 'Other' ? 1 : 0,  city]
end
# => [["Melbourne"], ["Sidney"], ["Other"]]

这里有一些事情发生。首先是destructuring bind|(city)|cities数组的每个元素本身就是一个数组,我们对该数组的第一个元素感兴趣。那是(city)周围括号的结果。

接下来是sort_by返回一个数组。比较两个数组时,比较两个数组的第一个元素。如果它们相等,则比较第二个元素,依此类推。因此,我们可以使用数组的第一个元素作为主要排序顺序:

city == 'Other' ? 1 : 0

并将数组的第二个元素作为辅助排序顺序:

city

主要排序顺序导致其他'其他'放在排序的最后。否则,元素按城市排序。