# 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,不過如果能更深入了解.& 背後的運作方法,相信會變得更厲害!