2015-02-06 152 views
3

如何通过引用变量alpha的每个字母对重音字的数组进行排序。以下代码仅为第一个字母的参考字母,因此我无法获得“ĝusti”,“ĝusti vin”,“ĝuspa”以正确排序。如何在ruby中对重音字的数组进行排序

我需要的代码的话这样的排序:

["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"]) 

回答

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)

+0

谢谢你这么多。 – hannaminx 2015-02-06 17:16:37

+0

未定义的方法'to_h'为#<枚举器:0x2bcfde8> – peter 2015-02-06 17:20:38

+0

这个作品+1000000 – 2015-07-31 02:30:08

5

您可以使用国际化的宝石是这样的:

# 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 
+0

谢谢这个! – MrYoshiji 2015-09-17 15:20:08