在Ruby中部分排序数组

我试图按字母顺序对数组排序,排除“其他”这个词,这是我想要在数组末尾的成员。 假设该数组如下所示:

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

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

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

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

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

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

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

这里有一些事情发生。 首先是所谓的解构绑定|(city)|cities数组的每个元素本身就是一个数组,我们对该数组的第一个元素感兴趣。 这就是(city)的括号带给我们的东西。

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

 city == 'Other' ? 1 : 0 

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

 city 

主要排序顺序会导致“其他”放在排序的末尾。 否则,元素按城市排序。