我正在尋找最有效的方法來做到這一點。任何帶有連字符的東西都必須在陣列中任何沒有連字符的符號之前。我的天真解決方案對陣列進行了兩次過濾并進行了連接。我覺得應該有一種方法可以一次性完成而不是兩次。
input = [:en, :de, :es, :"es-MX", :fr, :ko, :"ko-KR", :"en-GB"]
output = [:"es-MX", :"ko-KR", :"en-GB", :en, :de, :es, :fr]
天真的解決方案:
def reorder(input)
## find everything with a hypen
output = input.select { |l|
l.to_s.include?('-')
}
# find everything without a hyphen and concat to output
output.concat(input.reject { |l|
l.to_s.include?('-')
})
end
uj5u.com熱心網友回復:
這是一個排序任務,所以對我來說簡單地使用最有意義Enumerable#sort_by:
# Put symbols with hyphens first
input.sort_by { |s| s.to_s.include?('-') ? 0 : 1 }
如果您想按這些類別中的其他內容排序,您可以執行以下操作:
# Put symbols with hyphens first, then sort in alphabetical order
input.sort_by { |s| [s.to_s.include?('-') ? 0 : 1, s] }
uj5u.com熱心網友回復:
您可以使用 Array#partition 一次性過濾陣列:
def reorder(input)
a, b = input.partition { |l| l.to_s.include?('-') }
a.concat(b)
end
uj5u.com熱心網友回復:
input = [:en, :de, :es, :"es-MX", :fr, :ko, :"ko-KR", :"en-GB"]
代碼
p input.partition{|x|x.to_s.include?'-'}.flatten
輸出
[:"es-MX", :"ko-KR", :"en-GB", :en, :de, :es, :fr, :ko]
uj5u.com熱心網友回復:
正如我所看到的,你分兩次完成。
只需通過一次,您就可以添加一個if陳述句并檢查每個元素,left如果它包含連字符,則將其推送到right陣列上,否則推送到陣列上。
然后連接陣列。
def reorder(input)
left = []
right = []
input.each { |l|
if l.to_s.include?('-')
left.push(l)
else
right.push(l)
end
}
left.concat(right)
end
uj5u.com熱心網友回復:
這是一種對陣列進行單次傳遞并保留帶連字符的符號順序和不帶連字符的符號順序的方法。
def rearrange(arr)
a = arr.dup
pos = -1
a.size.times { |i| a.insert(pos =1, a.delete_at(i)) if a[i].to_s.include?('-') }
a
end
rearrange [:en, :de, :es, :"es-MX", :fr, :ko, :"ko-KR", :"en-GB"]
#=> [:"es-MX", :"ko-KR", :"en-GB", :en, :de, :es, :fr, :ko]
使用Kernel#dup(為了避免改變原始陣列)并不構成對陣列的傳遞,因為(據我所知)C 代碼復制了記憶體塊。
uj5u.com熱心網友回復:
怎么樣:
input.sort do |a,b|
next a <=> b if a.to_s.include?('-') == b.to_s.include?('-')
a.to_s.include?('-') ? -1 : 1
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/383479.html
