# Ruby 小知識03: 玩個排序小遊戲
###### tags: `Ruby`
### 題目如下
```ruby
# 排序規則:[1, 2, 4, 3, 5, 8, 7, 9, 6]
list1 = [1, 2, 3, 4]
list2 = [6, 2, 8, 5]
list3 = [7, 1, 5, 4]
def sort_by_rule(list)
# 實作
end
p sort_by_rule(list1) # 印出 [1, 2, 4, 3]
p sort_by_rule(list2) # 印出 [2, 5, 8, 6]
p sort_by_rule(list3) # 印出 [1, 4, 5, 7]
```
### 解題思考:
先把 [1, 2, 4, 3, 5, 8, 7, 9, 6]灌進一個hash,hash當中的key是a~i,可以直接用.sort方法被排序
定義一個方法,並可以傳入list陣列中的數字
可以依據list當中的數字當作要找的value,推導出hash中對應的key
排序key
印出value
```ruby
def sort_by_rule(list)
newhash = {a: 1, b: 2, c: 4, d: 3, e: 5, f: 8, g: 7, h: 9, i: 6}
#挑出對應的key
p1 = newhash.select{|key, value| value == list[0] }
p2 = newhash.select{|key, value| value == list[1] }
p3 = newhash.select{|key, value| value == list[2] }
p4 = newhash.select{|key, value| value == list[3] }
#把挑出來的陣列合併、依照字母順序排列、再組合成Hash後取其值
list_new = p1.merge(p2).merge(p3).merge(p4).sort.to_h.values
end
```
還在思考有沒有更好的解法
***
2121/11/22 更新
後來問同學,發現竟然可以利用.& 這個方法來寫 [可參考這裡](https://ruby-doc.org/core-2.7.0/Array.html#method-i-26)
```ruby=
# 排序規則:[1, 2, 4, 3, 5, 8, 7, 9, 6]
list1 = [1, 2, 3, 4]
list2 = [6, 2, 8, 5]
list3 = [7, 1, 5, 4]
def sort_by_rule(list)
rule = [1, 2, 4, 3, 5, 8, 7, 9, 6]
rule & list
end
p sort_by_rule(list1) # 印出 [1, 2, 4, 3]
p sort_by_rule(list2) # 印出 [2, 5, 8, 6]
p sort_by_rule(list3) # 印出 [1, 4, 5, 7]
```
突然有種白忙一場的感覺QQ,不過如果能更深入了解.& 背後的運作方法,相信會變得更厲害!