字符串的字典比较[不区分大小写]

Posted

技术标签:

【中文标题】字符串的字典比较[不区分大小写]【英文标题】:lexicographic comparison of strings [case-insensitive] 【发布时间】:2016-11-06 05:17:44 【问题描述】:

我想按字典顺序对文件的文本进行排序,但我无法理解字典顺序的真正作用。

排序字符串会产生另一个问题;关系运算符使用 ASCII 值,所以

betty < Diane 在应该为真时为假。

考虑一个示例列表: 贝蒂,黛安,123 岁,安娜,梅根,查尔斯,二,12 岁。

如何按字典顺序设置?

【问题讨论】:

这比你想象的要容易:std::string 已经在使用字典比较。 你这是什么意思? @someprogrammerdude 如果您想学习而不是使用 STL 让事情变得更容易,请尝试实现自己的基数排序。 它不像我要求代码大声笑,只是想要一些解释 【参考方案1】:

方法:

    使用map <convert_to_lower_case(words) as string, index as integer> 将所有单词放入列表中。

    然后使用以下命令创建一个排序向量myVec

    for(it_type iterator = m.begin(); iterator != m.end(); iterator++) myVec.push_back(original_list[it->second]);

myVec 是您要查找的按字典顺序排序的列表。 你需要实现convert_to_lower_case(word)

for(int i = 0; str[i]; i++)
  word[i] = tolower(str[i]);

其他答案也不错,使用比较器对向量进行排序。

【讨论】:

【参考方案2】:

这不是你想要的吗?

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cctype>

int main() 
  std::vector<std::string> v "Diane", "123", "Ana", "Megan", "charles", "two", "12";

  for (const auto& s : v) 
    std::cout << s << ' ';
  ;
  std::cout << '\n';

  std::sort(v.begin(), v.end(), [](const std::string& a, const std::string& b) 
    for (int i = 0 ; i < std::min(a.size(), b.size()) ; i++) 
      const auto a_char = std::tolower(a[i]);
      const auto b_char = std::tolower(b[i]);
      if (a_char != b_char) 
        return a_char < b_char;
      
    
    return a.size() < b.size();
  );

  for (const auto& s : v) 
    std::cout << s << ' ';
  ;
  std::cout << '\n';

  return 0;

stdout 看起来像这样:

Diane 123 Ana Megan charles two 12 
12 123 Ana charles Diane Megan two 

【讨论】:

这是错误的。不是不区分大小写的搜索。阅读完整的问题。【参考方案3】:

使用 compareToIgnoreCase 方法

【讨论】:

以上是关于字符串的字典比较[不区分大小写]的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中具有字符串键类型的不区分大小写字典

与一堆字符串比较不区分大小写

如何进行不区分大小写的字符串比较?

Go中不区分大小写的字符串比较

mysql字符串区分大小写的问题

PostgreSQL:不区分大小写的字符串比较