How can I sort an array of accented words by the every letter in reference to variable alpha. The code below only reference alpha for the first letter so I am unable to get "ĝusti", "ĝusti vin","ĝuspa" to sort correctly. 
I need the code to sort the words like this:
["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"])
                You could use the i18n gem like this:
# 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
gives
bonan matenon
ĉu vi parolas esperanton
ĝuspa
ĝusti
ĝusti vin
mi amas vin
pacon
                        The fix is quite obvious: instead of just returning the first character's index, map all characters to their respective index:
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"])
Output:
bonan matenon
ĉu vi parolas esperanton
ĝuspa
ĝusti
ĝusti vin
mi amas vin
pacon
To speed up index lookup, you could use a hash:
alpha = "abcĉdefgĝhĥijĵklmnoprsŝtuŭvz".each_char.with_index.to_h
#=> {"a"=>0, "b"=>1, "c"=>2, ..., "v"=>26, "z"=>27}
and call alpha[c] instead of alpha.index(c)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With