6

给定以下红宝石数组:

["2XL", "3XL", "4XL", "5XL", "6XL", "L", "M", "S", "XL"]

我如何对其进行排序以使其按此顺序排列?

["S", "M", "L", "XL", "2XL", "3XL", "4XL", "5XL", "6XL"]

请注意,并非总是存在每种尺寸。

为了历史的缘故,这是我最初的实现。

sorted_sizes = []

sorted_sizes << "S" if sizes.include?("S")
sorted_sizes << "M" if sizes.include?("M")
sorted_sizes << "L" if sizes.include?("L")
sorted_sizes << "XL" if sizes.include?("XL")
sorted_sizes << "2XL" if sizes.include?("2XL")
sorted_sizes << "3XL" if sizes.include?("3XL")
sorted_sizes << "4XL" if sizes.include?("4XL")
sorted_sizes << "5XL" if sizes.include?("5XL")
sorted_sizes << "6XL" if sizes.include?("6XL")

sorted_sizes
4

4 回答 4

17
["S", "M", "L", "XL", "2XL", "3XL", "4XL", "5XL", "6XL"] & ["2XL", "3XL", "4XL", "5XL", "6XL", "L", "M", "S", "XL"]
# => ["S", "M", "L", "XL", "2XL", "3XL", "4XL", "5XL", "6XL"]
于 2013-10-18T22:03:54.873 回答
7

这是一种可以处理重复的方法:

SORT_ORDER = ["S", "M", "L", "XL", "2XL", "3XL", "4XL", "5XL", "6XL"]

["2XL", "3XL", "4XL", "5XL",
 "6XL", "L", "M", "S", "XL"].sort_by { |x| SORT_ORDER.index(x) }
于 2013-10-18T22:08:49.327 回答
4

我真的很喜欢 @nicooga 的版本来解决这个问题,并且只是建议将逻辑包装在 lambda 中。这样它就可以在整个代码的许多地方使用。

clothing_size = ->x{%w(S M L XL 2XL 3XL 4XL 5XL 6XL).index(x)}

size_list = ["2XL", "3XL", "4XL", "5XL", "6XL", "L", "M", "S", "XL"]

size_list.sort_by &clothing_size
于 2013-10-18T22:17:07.430 回答
1
array = ["2XL", "3XL", "4XL", "6XL", "L", "M", "S", "XL"] 
sort_order = ["S", "M", "L", "XL", "2XL", "3XL", "4XL", "5XL", "6XL"]

sort_order - (sort_order - array)
  # => ["S", "M", "L", "XL", "2XL", "3XL", "4XL", "6XL"]
于 2013-10-20T02:31:22.823 回答