【问题标题】:Sorting a list of numbers first alphabetically and then numerically首先按字母顺序对数字列表进行排序,然后按数字排序
【发布时间】:2014-07-10 09:55:26
【问题描述】:

我需要先按字母顺序对给定数字进行排序,然后再按数字升序排序。 例如我有这些数字

{"10", "1", "2", "20", "200", "3", "300", "30", "201", "21"}

我要这个订单

{"1", "10", "2", "20", "21", "200", "201", "3", "30", "300"}

我写了下面的比较函数对它们进行排序。

bool AlphaNumericCompare(const string & str1, const string& str2 )
{
    int ind1 = 0, ind2 = 0;
    while ( ind1 < str1.size() && ind2 < str2.size() )
    {
        if( str1[ind1] < str2[ind2] )
            return true;
        else if( str1[ind1] > str2[ind2] )
            return false;
        ind1++;
        ind2++;
    }
    if( ind1 == str1.size() && ind2 == str2.size() )
    {
        return true;
    }
    else if( ind1 == str1.size() )
    {
        return true;
    }
    return false;
}

但是这个函数给了我以下命令

{"1", "10", "2", "20",  "200", "201", "21", "3", "30", "300"}

其中 200 和 201 放在 21 之前。 谁能建议如何更改上述比较函数以获得所需的排序顺序?

【问题讨论】:

  • 使用自定义比较器对std::sort 进行两次调用就足够了:第一个按字母顺序排序,第二个按数字排序。
  • 如果我们先按字母顺序排序,第二个数字不会按原始顺序排序吗?例如 200、30 在按字母排序后按该顺序放置。数字排序后这个顺序会不会颠倒?
  • 我不明白所需的输出是如何“先按字母顺序,然后按数字升序”排序的。
  • 任务不清楚。您是否希望以相同数字开头的所有数字都放在一起,并且在这些组中对值进行排序?
  • 在上面的例子中,按照字母顺序,200 应该在 30 之前,但是按照数字顺序,21 应该在 200 之前,即使它按照字母顺序是相反的

标签: c++ sorting comparison


【解决方案1】:

调用std::sort 就足够了,带有自定义比较器功能。类似的东西

std::sort(std::begin(collection), std::end(collection),
          [](const std::string& s1, const std::string& s2)
          {
              auto i1 = std::stoll(s1);
              auto i2 = std::stoll(s2);
              return (s1 < s2 && i1 < i2);
          });

请注意,它未经测试。

【讨论】:

  • 这是他们要求的,但我认为这不是他们想要的,因为它给出了不同的结果。
  • 是的,它不会产生所需的输出。
【解决方案2】:

如果我对任务的理解正确,您希望数字首先按其第一个字符分组,然后在这些组中排序。

这似乎可以完成这项工作:

std::sort(v.begin(), v.end(), [](const std::string& a, const std::string& b) {
    if (a[0] < b[0]) {
        return true;
    } else if (a[0] > b[0]) {
        return false;
    }
    return std::stoi(a) < std::stoi(b);
});

它首先检查字符串的第一个字符。如果第一个字符相同,则执行数字排序。

【讨论】:

  • 让我看看这个解决方案
  • @RaviChandra 检查多个输入以确保我正确理解了问题。您给出的示例可能恰好是正确的。
  • 是的,我正在测试大量输入。非常感谢!
  • 我的大量输入没有给出正确的顺序。我正在尝试从一个会失败的大型测试用例中准备一个小测试用例。
猜你喜欢
  • 2021-12-28
  • 1970-01-01
  • 2020-09-03
  • 2013-06-29
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
相关资源
最近更新 更多