【问题标题】:Sorting on two dimensions in a one dimensional array在一维数组中对二维进行排序
【发布时间】:2017-05-25 22:58:50
【问题描述】:

假设我有一个像这样的一维列表

A8, C3, C7, F9, A3, V3, J2

如果我想按第一个字符的字母顺序和第二个字符的数字顺序对该列表进行排序,我该怎么做?

我假设我必须优先考虑某个排序,并降低次要排序的优先级,例如:

A1, B2, C1

A1肯定是第一,但接下来的问题是,应该是:

{A1, C1, B2},还是{A1, B2, C1}

我的最后一个问题是,如果我想优先考虑数字排序,我假设我会将其作为第二种排序,而不是大多数语言中标准排序算法的第一种排序?

我最关心的是在 C++ 中实现的排序

struct CustomSort{

    bool operator()(tuple<int,regex> const &lhs, tuple<int,regex> const &rhs){
        return std::get<0>(lhs) > std::get<0>(rhs);
    }
};

【问题讨论】:

  • 你的数据结构是什么?一个字符串容器?
  • 是的,就问题而言,假设它是一个字符串数组,每个字符串都有一个字母的第一个字符,第二个字符是一个数字。
  • C++ 代码引用了一个元组,但请假设元组的第一个元素代表有问题的数组。
  • 这个问题对你有意义吗?我希望这很清楚。我只是想把这件事做好。

标签: c++ arrays node.js sorting


【解决方案1】:

假设您的数组 (arr) 是 std::string 的容器,并且您希望优先考虑数字排序(即 C1 &lt; A3),您可以通过调用 std::sort 来实现(我是在这里使用 c++11 lambda,但如果需要,您可以使用自定义 Comparator):

std::sort(begin(arr), end(arr), [](std::string const& lhs, std::string const& rhs) {
    return std::tie(lhs[1], lhs[0]) < std::tie(rhs[1], rhs[0]);
});

我没有将第二个char 转换为int,因为标准保证'0' &lt; '1' &lt; ... &lt; '9',但这假设您只有09 之间的数字。

如果你想优先排序第一个字符,你只需要做一个标准的std::sort

std::sort(begin(arr), end(arr));

【讨论】:

  • 你甚至可以做return std::tie(lhs[1], lhs[0]) &lt; std::tie(rhs[1], rhs[0]);(这样可以避免做一个无效的比较器)。
猜你喜欢
  • 2013-08-17
  • 2012-04-03
  • 2015-09-17
  • 2018-06-02
  • 2017-04-18
  • 2013-12-16
  • 1970-01-01
相关资源
最近更新 更多