在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
主要排序顺序会导致“其他”放在排序的末尾。 否则,元素按城市排序。