我正在尝试按字母顺序对世界语中的一系列短语进行排序。有没有办法使用sort_by
来实现这个目标?
我正在检查字符串的每个字符与世界语字母表中的索引,每个增加的索引在排序优先级方面都要低一步:
esp_alph = " abcĉdefgĝhĥijĵklmnoprsŝtuŭvz"
arr.sort_by {|string|
[esp_alph.index(string[0]),
esp_alph.index(string[1]),
esp_alph.index(string[2]),
esp_alph.index(string[3])]}
然而,这不是一个可扩展的解决方案,如果我的条件比我的字符串中的字符更多,它就会中断。看起来我在基于我的字符串长度的循环的尖端,但我无法弄清楚如何在没有语法错误的情况下实现它。或者有更好的方法来解决这个问题吗?
答案 0 :(得分:2)
只需将世界语字母表中的所有字符替换为ASCII表格中的某些字符,以便世界语字母顺序与ASCII顺序匹配。
假设您按照您给出的顺序拥有世界语字母表,我假设它们按照它们应该的顺序排列:
esp_alph = " abcĉdefgĝhĥijĵklmnoprsŝtuŭvz"
并取出相同长度的ASCII字符表的任何部分(注意\\
是单个字符):
ascii = "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\"
或
ascii = "@-\\"
然后,您可以这样做:
arr.sort_by{|string| string.tr(esp_alph, ascii)}
此处,tr
比gsub
快,我觉得它足够扩展。
答案 1 :(得分:0)
esp_alph
为了获得更好的性能,{{1}}字符串应该是哈希值。
答案 2 :(得分:0)
ESP_ALPH = "abcĉdefgĝhĥijĵklmnoprsŝtuŭvz"
ESP_MAP = ESP_ALPH.each_char.with_index.to_a.to_h
#=> {"a"=> 0, "b"=> 1, "c"=> 2, "ĉ"=> 3, "d"=> 4, "e"=> 5, "f"=> 6,
# "g"=> 7, "ĝ"=> 8, "h"=> 9, "ĥ"=>10, "i"=>11, "j"=>12, "ĵ"=>13,
# "k"=>14, "l"=>15, "m"=>16, "n"=>17, "o"=>18, "p"=>19, "r"=>20,
# "s"=>21, "ŝ"=>22, "t"=>23, "u"=>24, "ŭ"=>25, "v"=>26, "z"=>27}
def sort_esp(str)
str.each_char.sort_by { |c| ESP_MAP[c] }.join
end
str = ESP_ALPH.chars.shuffle.join
#=> "hlbzŭvŝerĝoipjafntĵsmgĉdukĥc"
sort_esp(str) == ESP_ALPH
#=> true