我试图按字母顺序对数组排序,排除单词" Other",这是我想要在数组末尾的成员。让我们说该数组如下所示:
cities = [["Sidney"], ["Other"], ["Melbourne"]]
简单地说,cities.sort
只需执行以下操作:
[["Melbourne"], ["Other"], ["Sidney"]]
我希望成员按字母顺序排列在最后["Other"]
,如下:
[["Melbourne"], ["Sidney"], ["Other"]]
有人能指出我在正确的方向吗?
答案 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
主要排序顺序导致其他'其他'放在排序的最后。否则,元素按城市排序。