如何在ruby中对一组重音词进行排序

han*_*inx 5 ruby sorting

如何通过引用变量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)


Ste*_*fan 7

修复非常明显:不是只返回第一个字符的索引,而是将所有字符映射到它们各自的索引:

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)

  • @MuhammadUmer当然可以比较数组.从[`Array#<=>`](http://ruby-doc.org/core-2.2.2/Array.html#method-i-3C-3D-3E):*"数组进行比较"元素方式"方式;使用<=>运算符将ary的第一个元素与other_ary的第一个元素进行比较,然后将每个第二个元素等等..."* (2认同)