按字母顺序排序åäö

时间:2017-04-10 12:56:41

标签: c++ sorting

我有一个algoritm按字母值按字母顺序排序单词,这一切都正常,直到我包含å ä ö,因为它们返回的int值范围从-103到{{1} }。因此,单词的顺序就像这个-124,例如,它应该是ä å ö a那么如何才能使它与a å ä ö.最后一次正确排序?

编辑:我不允许使用花哨的功能,这就是为什么这段代码是如此裸露,也使用å ä ö

我的代码:

using namespace std是一个pali类型的字符串,用于存储单词

vector

}

2 个答案:

答案 0 :(得分:2)

一般而言,任何给定语言中字母的字母顺序与分配给任何给定字符集中的所述字母的数字代码之间没有关系。为了根据给定语言的字母顺序(或更一般地,当前语言环境 collat​​ion 顺序)比较字符串,C有一个名为{{3的特殊函数}}

要使用它,您需要相应地设置您的语言环境。遗憾的是,区域设置名称在C中不是标准。如果您使用的是Windows,则链接的示例不太可行。

这是您应该在真实软件中使用的内容。因为你不应该使用花哨的库函数,所以对你的任务来说很重要。您需要自己实现类似于strcoll的功能,它应该只适用于您的语言。

在每个字符在字母表中都有自己位置的语言中,此函数很简单:编写一个接受字符并在字母表中返回其位置的函数(例如,'a'返回1'b'返回2,...,'å'返回27,'ä'返回28 ...)根据此函数返回的数字比较字符串。这可能会也可能不会考虑字母大小写,具体取决于您想要的确切排序顺序。

如果你不想写一个大开关,你可以使用ASCII中的字母已经按你的意愿排序,你只需要修改三个额外字母的顺序。所以你可以这样写:

int collation_order(int ch) {
  switch (ch) {
     case 'Å':  return 'Z'+1;
     case 'å':  return 'z'+1;
     case 'Ä':  return 'Z'+2;
     case 'ä':  return 'z'+2;
     case 'Ö':  return 'Z'+3;
     case 'ö':  return 'z'+3;
     default :  return ch;
  }
}

int my_strcoll (char* p, char* q)
{
  int pp, qq;
  while (*p && (pp=collation_order(*p)) == (qq = collation_order(*q))) {
    p++; q++;
  }
  return pp - qq;
}

当然这意味着在ASCII表中Z / z之后出现的非字母将被错误地排序。如果你想在Ö/ö之后对它们进行排序,你需要相应地扩展collation_order。尝试这样做而不需要为每个角色使用case

另一种写collation_order的方法是使用字符代码(强制转换为unsigned char)作为256个整数元素数组中的索引。

另请注意,旧的8位编码是旧的,不应该用于严肃的新开发。有关详细信息,请阅读strcoll

答案 1 :(得分:0)

由于您的选项受到约束,并且您还可以将输入约束到可预见的Universe,我建议您使用简单的解析器函数将非ASCII字符放在您知道的位置内:

int parse_letter( int source )
{
    switch( source )
    {
        case 'å':
        case 'ä':    return 'a';
        case 'ö':    return 'o':
        // as many cases as needed...
        default:     return source;
    }
}