如何通过引用变量alpha的每个字母对一组重音词进行排序.下面的代码只引用第一个字母的alpha,所以我无法得到" ?usti"," ?usti vin"," ?uspa"正确排序.
我需要代码来对这样的单词进行排序:
["bonan matenon", "?u vi parolas esperanton","?uspa", "?usti", "?usti vin", "mi amas vin", "pacon"]
def alphabetize(phrases)
alpha = "abc?defg?h?ij?klmnoprs?tu?vz".split(//)
phrases.sort_by { |phrase|
alpha.index(phrase[0])
}
end
alphabetize(["mi amas vin", "bonan matenon", "pacon", "?u vi parolas esperanton", "?usti", "?usti vin","?uspa"])
Run Code Online (Sandbox Code Playgroud)
pet*_*ter 11
您可以像这样使用i18n gem:
# encoding: UTF-8
require 'i18n'
I18n.enforce_available_locales = false
a = ["bonan matenon", "?u vi parolas esperanton","?uspa", "?usti", "?usti vin", "mi amas vin", "pacon"]
b = a.sort_by { |e| I18n.transliterate e }
puts b
Run Code Online (Sandbox Code Playgroud)
给
bonan matenon
?u vi parolas esperanton
?uspa
?usti
?usti vin
mi amas vin
pacon
Run Code Online (Sandbox Code Playgroud)
修复非常明显:不是只返回第一个字符的索引,而是将所有字符映射到它们各自的索引:
def alphabetize(phrases)
alpha = "abc?defg?h?ij?klmnoprs?tu?vz".chars
phrases.sort_by do |phrase|
phrase.chars.map { |c| alpha.index(c) }
end
end
puts alphabetize(["mi amas vin", "bonan matenon", "pacon", "?u vi parolas esperanton", "?usti", "?usti vin","?uspa"])
Run Code Online (Sandbox Code Playgroud)
输出:
bonan matenon
?u vi parolas esperanton
?uspa
?usti
?usti vin
mi amas vin
pacon
Run Code Online (Sandbox Code Playgroud)
要加速索引查找,您可以使用哈希:
alpha = "abc?defg?h?ij?klmnoprs?tu?vz".each_char.with_index.to_h
#=> {"a"=>0, "b"=>1, "c"=>2, ..., "v"=>26, "z"=>27}
Run Code Online (Sandbox Code Playgroud)
并打电话alpha[c]而不是alpha.index(c)