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

时间:2015-02-06 15:14:12

标签: ruby sorting

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

2 个答案:

答案 0 :(得分:8)

您可以像这样使用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

给出

bonan matenon
ĉu vi parolas esperanton
ĝuspa
ĝusti
ĝusti vin
mi amas vin
pacon

答案 1 :(得分: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"])

输出:

bonan matenon
ĉu vi parolas esperanton
ĝuspa
ĝusti
ĝusti vin
mi amas vin
pacon

为了加速索引查找,您可以使用哈希:

alpha = "abcĉdefgĝhĥijĵklmnoprsŝtuŭvz".each_char.with_index.to_h
#=> {"a"=>0, "b"=>1, "c"=>2, ..., "v"=>26, "z"=>27}

并致电alpha[c]而非alpha.index(c)