如何根据非标准字母对字符串数组进行排序?

时间:2016-03-03 16:53:08

标签: ruby sorting alphabetical

我正在尝试按字母顺序对世界语中的一系列短语进行排序。有没有办法使用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])]}

然而,这不是一个可扩展的解决方案,如果我的条件比我的字符串中的字符更多,它就会中断。看起来我在基于我的字符串长度的循环的尖端,但我无法弄清楚如何在没有语法错误的情况下实现它。或者有更好的方法来解决这个问题吗?

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)}

此处,trgsub快,我觉得它足够扩展。

答案 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