2017-01-11 3 views
0

Say У меня есть один одномерный список как такСортировка по двум измерениям в одномерном массиве

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); 
    } 
}; 
+0

Какова ваша структура данных? Контейнер строк? – Holt

+0

Да, для целей вопроса предположим, что это массив строк, причем каждая строка имеет первый символ буквы алфавита, а второй символ - номер. – Olegzandr

+0

Код C++ ссылается на кортеж, но, пожалуйста, предположите, что первые элементы кортежа представляют собой массив, о котором идет речь. – Olegzandr

ответ

1

Предполагая, что ваш массив (arr) представляет собой контейнер std::string, и что вы хотите, чтобы приоритеты числовую сортировку (т.е. C1 < A3), вы можете сделать это с помощью одного вызова к std::sort (я использую C++ 11 лямбда здесь, но вы можете использовать пользовательские 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]); 
}); 

Я не CONVER ting второй char до int, поскольку стандарт гарантирует '0' < '1' < ... < '9', но это предполагает, что у вас есть только номера между 0 и 9.

Если вы хотите, чтобы приоритеты сортировки по первому символу, вы просто должны сделать стандартный std::sort:

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

Вы можете даже сделать 'return std :: tie (lhs [1], lhs [0]) Jarod42

Смежные вопросы