如果我有一個數組:array = ["ruby", "code", "library"]
。如何將匹配的/ ^庫$ /元素移動到開頭。所以陣列看起來像這樣:array = [「library」,「ruby」,「code」]紅寶石排序陣列 - 移動匹配元素到開始
回答
它可以通過多種方式完成。這是一個
array = ["ruby", "code", "library"]
array.partition { |element| element.match /^library$/ }.flatten
[Enumerable#partition](http://ruby-doc.org/core-2.2.0/Enumerable.html#method-i-partition)可能會保留順序,但是文檔是靜音的。 –
def move_to_front(arr, pattern)
mi = matching_indices(arr, pattern)
return arr unless mi
a = arr.dup
mi.reverse_each.with_object([]) { |i,b| b.unshift(a.delete_at(i)) }.concat(a)
end
def matching_indices(arr, pattern)
arr.each_index.select do |i|
case pattern
when Regexp then arr[i] =~ pattern
when Proc then pattern[arr[i]]
else (arr[i] == pattern)
end
end
end
move_to_front ["ruby", "code", "library"], /\Alibrary\z/
#=> ["library", "ruby", "code"]
move_to_front ["ruby", "library", "code", "library"], "library"
#=> ["library", "library", "ruby", "code"]
move_to_front ["ruby", "libraries", "code", "library"], /librar(?:ies|y)/
#=> ["libraries", "library", "ruby", "code"]
move_to_front ["ruby", "libraries", "code", "library"], /\Alibrar/
#=> ["libraries", "library", "ruby", "code"]
move_to_front ["ruby", "libraries", "code", "library"],
->(str) { str =~ /librar(?:ies|y)/ }
#=> ["libraries", "library", "ruby", "code"]
move_to_front ("1".."9").to_a, /[13579]/
#=> ["1", "3", "5", "7", "9", "2", "4", "6", "8"]
move_to_front ("1".."9").to_a, ->(n) { n.to_i.odd? }
#=> ["1", "3", "5", "7", "9", "2", "4", "6", "8"]
move_to_front ("1".."9").to_a, ->(n) { false }
#=> ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
move_to_front ("1".."9").to_a, ->(n) { true }
#=> ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
注:
matching_indices ["ruby", "libraries", "code", "library"], /librar(?:ies|y)/
#=> [1, 3]
的方法move_to_front
保留該移動這些元素的順序和那些沒有移動。
三分一分。
array.inject([]){|a,e| e[/^library/] ? a.unshift(e) : a<<e}
和
array & ["library"] | array
如果數組包含搜索元素多次成爲
array.find_all{ |e| e[/^library/] } + array.reject{ |e| e[/^library/] }
如果你不喜歡使用數組變量的兩倍還可以這樣
[array].map{|a| a & ["library"] | a}.flatten
Th e最後一個:使用grep
array.grep(/library/) + array.grep(/^(?!library)/)
最後一個不會做你認爲它的作用。 '/ [^ library] /'會匹配任何包含'l','i','b'等字符的字符串。也許你的意思是'/ ^(?!library)/'? –
@Jordan,我知道這和/ ^(?!庫)/會更好,我猜想,但事情是:它的作品,因爲它可以讓其他字符串,而不是「圖書館」 – peter
當然,但它也會匹配'「lliibbrraarryy」'和''yrarbil「'。 –
- 1. 紅寶石排序兩個陣列
- 2. 重新排序紅寶石陣列
- 3. 按數字排序紅寶石陣列
- 4. 紅寶石陣列從1開始
- 5. 紅寶石組合與陣列元素
- 6. 紅寶石,排序陣列由
- 7. 紅寶石陣列平等
- 8. 添加元素到紅寶石陣列返回新陣列
- 9. 紅寶石陣列內部
- 10. 紅寶石:在陣列
- 11. 紅寶石陣列麻煩
- 12. 排序散列紅寶石
- 13. 紅寶石塊到陣列
- 14. 紅寶石陣列切片
- 15. 陣列中的紅寶石
- 16. 兩個紅寶石陣列
- 17. 紅寶石陣列
- 18. 排序紅寶石
- 19. 完成紅寶石陣列
- 20. 如何刪除一個元素開始以下劃線紅寶石陣列
- 21. 排序:排序陣列基於多個條件紅寶石
- 22. 紅寶石氣泡排序不排序所有元素
- 23. 如何匹配紅寶石
- 24. 紅寶石:排序被「連接」到另一個陣列
- 25. 紅寶石排序陣列以相反的順序
- 26. 紅寶石陣列適配器
- 27. 紅寶石:生成陣列
- 28. 紅寶石「bucketize」陣列
- 29. 合併紅寶石陣列
- 30. 陣列消除元件根據元素的紅寶石
雖然我認爲Sean的回答比較好,可以使用'array.sort {| str | str.match(/^library $ /)? 0:1}' –